【pwnable.kr】 uaf
目测是比较接近pwnable的一道题。考察了uaf(use after free的内容),我觉得说白了就是指针没有初始化的问题。

ssh uaf@pwnable.kr -p2222 (pw:guest)
先看一下代码
#include <fcntl.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
using namespace std; class Human{
private:
virtual void give_shell(){
system("/bin/sh");
}
protected:
int age;
string name;
public:
virtual void introduce(){
cout << "My name is " << name << endl;
cout << "I am " << age << " years old" << endl;
}
}; class Man: public Human{
public:
Man(string name, int age){
this->name = name;
this->age = age;
}
virtual void introduce(){
Human::introduce();
cout << "I am a nice guy!" << endl;
}
}; class Woman: public Human{
public:
Woman(string name, int age){
this->name = name;
this->age = age;
}
virtual void introduce(){
Human::introduce();
cout << "I am a cute girl!" << endl;
}
}; int main(int argc, char* argv[]){
Human* m = new Man("Jack", );
Human* w = new Woman("Jill", ); size_t len;
char* data;
unsigned int op;
while(){
cout << "1. use\n2. after\n3. free\n";
cin >> op; switch(op){
case :
m->introduce();
w->introduce();
break;
case :
len = atoi(argv[]);
data = new char[len];
read(open(argv[], O_RDONLY), data, len);
cout << "your data is allocated" << endl;
break;
case :
delete m;
delete w;
break;
default:
break;
}
} return ;
}
很明显的是有虚函数的继承,内存的申请,内存的释放,利用思路就是改函数的虚表地址达到执行命令的作用。
执行的命令也不用写shellcode,源代码中的getshell函数就可以用。
首先,UAF是个啥,名字叫Use-After-Use,就是释放后重用,是堆上的一种漏洞,就是在把申请的内存释放后,指向之前内存的指针没有重置为NULL,导致该指针还能访问原来的内存。
这道题也是一样。当释放了w、m后,当再次调用w、m指针就会出问题。
当然直接调用时不会重新执行w->introduct函数的,这是因为堆块会有分配和未分配两种状态,在状态转换时会修改堆块内容。
当然,linux在堆分配中有一种快速分配机制,导致了该程序存在的漏洞。
详细可以参考《C和C++安全编码》一书。
在这道题中,如果想利用堆快速分配的机制,需要请求分配的堆块大小是一样的,即argv[1]=sizeof(Women)
这个大小可以再汇编代码中找到

0x18 = 24 所以argv[1]=24
通过跟踪分配可以跟踪到虚表的内容,具体跟踪如下图:

可以发现,虚表地址是位于结构体内存的最前面8个字节。而函数的调用就是这个虚表指针+偏移
比如Human->give_shell 就是 vTable_ptr + 0
因此,仅需修改一个指针即可,再看修改位置,read函数是从argv[2]所指的文件中获取,所以要把这个地址写到文件中,并且不需要填充。
写的内容需要调用give_shell函数,由于函数后来要调用introduce函数,地址是 vTable_ptr + 8,因此将虚表指针改写为0x401588即可。
先写一个/tmp/p4nda文件,内容是0x401588:
from pwn import * addr = 0x401588
f = open('/tmp/p4nda',"wb")
f.write(p64(addr))
f.close
再顺序执行3->2->2->1即可

note:执行两次2的原因是分配的顺序是后释放先分配,而函数执行的顺序恰好是反过来的,因此需要执行两次,让m指针也被分配就可以了。
【pwnable.kr】 uaf的更多相关文章
- 【pwnable.kr】 asm
一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...
- 【pwnable.kr】 [simple login]
Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...
- 【pwnable.kr】 brainfuck
pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...
- 【pwnable.kr】 unlink
pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...
- 【pwnable.kr】 memcpy
pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...
- 【pwnable.kr】 codemap
pwnable新的一题. download: http://pwnable.kr/bin/codemap.exe ssh codemap@pwnable.kr -p2222 (pw:guest) 这道 ...
- 【pwnable.kr】input
这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...
- 【pwnable.kr】cmd2
这道题是上一个cmd1的升级版 ssh cmd2@pwnable.kr -p2222 (pw:mommy now I get what PATH environmentis for :)) 登录之后, ...
- 【pwnable.kr】cmd1
最近的pwnable都是linux操作系统层面的. ssh cmd1@pwnable.kr -p2222 (pw:guest) 首先还是下载源代码: #include <stdio.h> ...
随机推荐
- idea右键新建选项没有类和包的创建方式
Intelidea创建好项目之后,右键新建Java class的时候发现没有改选项,只有以下几个选项 把sec目录设为源码目录,首先打开Project Structure
- windows 10 遥控操作和传输文件
传输文件命令 scp file user@192.168.1.1:/home/ file文件传到192.168.1.1/home/目录下 scp -r directory user ...
- 搭建 nginx + rtmp 媒体服务器笔记
工作需要搭建一个流媒体服务器,用来接收前端推过来的视频流,达到实时保存的目的. 具体步骤网上已经比较详细了 可以参考下面这个文档参考文档 https://www.cnblogs.com/monjeo/ ...
- C#Winfrom实现Skyline画直线功能
C#Winfrom实现Skyline画直线功能 前言: 这里记录了我在学习Skyline二次开发中所遇到的问题,适合刚接触Skyline二次开发的同学查看使用,从逻辑到代码逐一详解,但是还是重在理解, ...
- Press Key关键字用法
语法:Press Key locator 按键编码 press key关键字后面的键位对应ascii码实际为16进制格式 NULL = '\ue000'CANCEL = '\ue001' # ...
- [Database] MAC MySQL中文乱码问题
1 确保数据库编码设置, 可修改my.cnf mysql> show variables like '%character%'; +--------------------------+---- ...
- GreenPlum 提取数据表信息
参考: https://www.alberton.info/postgresql_meta_info.html https://my.oschina.net/Kenyon/blog/226600 列信 ...
- 28 最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 解法1:对于小规模数据,可以采用类似前题的快速排序思路 ...
- leetcode236 Lowest Common Ancestor of a Binary Tree
""" Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in ...
- Vue + Webpack 根据不同环境打包
修改 prod.env.js // 当前正在运行的脚本名称 const TARGET = process.env.npm_lifecycle_event // 第一个参数 let argv = pro ...