xdctf2015_pwn200(栈溢出,ret2dlresolve)
# 1. 查看程序
32 位程序,开启了 NX
ida32 查看
main:
vuln:
# 2. 漏洞分析
可以发现 read 读入的字节数可以导致栈溢出,但是没有后门函数,我们可以进行泄露 libc 来 getshell,但是这里换一个方法,通过利用 ret2dlresolve 来解决, ret2dlresolve 通常利用在无法泄露出地址时,通过让 dl_runtime_reslove 函数来解析函数名达到执行动态链接库函数的目的
因为 dl_runtime_resolve 函数没有检查边界,所以我们可以将其对应的结构体写入其他地址,然后通过一定 偏移 大小来使 dl_ru
more...xdctf2015_pwn200(栈溢出)
# 1. 查看程序
32 位程序,开启了 NX
ida32 查看
main:
vuln:
# 2. 漏洞分析
可以发现 read 读入的字节数可以导致栈溢出,但是没有后门函数,我们可以进行泄露 libc 来 getshell,这里利用 LibcSearcher 没有找到对应的 libc,然后就用了 DynELF 方法,来找到 system 地址,但是还是没有成功
# 3.exp
最后利用别人的偏移量才成功,泄露的地址是对的,但是都找不到正确的偏移量就用了别人的
nfrom pwn import *from LibcSearcher import *context.log_level
more...bbys_tu_2016(栈溢出)
# 1. 查看程序
32 位程序,开启了 NX
main:
printFlag:
# 2. 漏洞分析
这里调用了 scanf 函数,可以进行溢出,然后有个后门函数,溢出返回到这里就可以得到 flag
这里看 ida 的距离 ebp 的偏移不准确,gdb 调试是 24 (0x18), 而 ida 是 0x10
# 3.exp
nfrom pwn import *from LibcSearcher import *#context.log_level = 'debug'context(os='linux', arch='
more...ciscn_2019_s_4(栈溢出)
# 1. 查看程序
32 位程序,开启了 NX
ida 反汇编:
vul函数 :可以看到只能溢出两个字,也就只能覆盖 ebp 和 ret,这种一般都需要栈迁移
hack函数 :只提供了 system 函数,无法获得 flag,所以不能直接用这个地址覆盖 ret
# 2. 漏洞分析
由于可以溢出的字节数太小,所以就需要进行栈迁移,这里要考虑迁移的地址,首先 bss 段上没有很大的空间,并且没有备份去写入内容到 bss,所以就只能考虑栈上,那么就需要我们泄露栈上的地址,这里就可以利用 printf 来打印出 mian 函数的 ebp 地址再利用偏移就能计算出我们输入的字符串的地址:
more...mrctf2020_easyoverflow(栈溢出)
# 1. 查看程序
64 位程序,保护全开
ida 反汇编查看:
从上面看到会将一个字符串复制到 V5,然后有一个 check 的函数:
fake_flag:
check 函数会将复制过去的 v5 与系统保存的字符串逐个进行对比,直到对比时两个字符串相等时返回 1 ,就可以 getshell
# 2. 漏洞分析
由于一开始复制给 v5 的字符串在栈上,而后面有个 get 函数也是往栈上写内容,并且地址更低也就可以覆盖 v5 的内容来满足后面的判断
# exp
nfrom pwn import *from LibcSearcher import *#context.log_level
more...PicoCTF_2018_buffer_overflow_2(栈溢出)
# 1. 查看程序
32 位程序,开启了 NX
IDA32 查看
main:
vuln:
后门 win:
# 2. 漏洞分析
有 gets 函数可以导致任意字节的溢出,然后有个后门,溢出到这里传参满足条件就行
# 3.exp
nfrom pwn import *from LibcSearcher import *#context.log_level = 'debug'context(os='linux', arch='i386', log_level='debug')p=r
more...wustctf2020_getshell_2(栈溢出)
# 1. 查看程序
32 位程序,开启了 nx
ida32 查看
main:
vulnerable: (可以溢出 12 个字节,也就是 32 位的 3 个字)
后门 shell ,可以发现并不是 '/bin/sh',被用来进行干扰了
# 2. 漏洞分析
一开始想着用栈迁移
因为后门有执行 system 函数,尽管无法 getshell,但是却提供了 call system,
限制了溢出的字节数,所以无法利用 system_plt 的地址 (因为需要返回地址,这样字节数不够),【而 call system 会直接将下一个命令压入栈中】,也就避免了在
more...