ROP.md

ROP合集

ROP-ret2libc

环境:glibc 2.31 Ubuntu20.04

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// gcc -O0 -fno-stack-protector ret2libc.c -no-pie -o retlibc
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

void print_name(char *input)
{
char buf[0x20]; // strcpy(buf, input);
memcpy(buf, input, 0x100);
printf("Hello %s\n", buf);
}

int main(int argc, char **argv)
{
char buf[0x100];
puts("welcome to stack5");
printf("Here is a gift: %p\n", stdout);
puts("input your name plz");
read(0, buf, 0x100);
print_name(buf);
return EXIT_SUCCESS;
}

stdout ??

C语言中的 stdout 是一个定义在<stdio.h>的宏(macro),它展开到一个 FILE* (“指向 FILE 的 指针”)类型的表达式(不一定是常量),这个表达式指向一个与标准输出流(standard output stream)相关连的 FILE 对象。 只是方便操作输出,比如传给一个函数等等。这时函数的输出就不是输出到文件,而是传进来的 stdout文件指针,即标准输出。

stdout(Standardoutput)标准输出 stdin(Standardinput)标准输入 stderr(Standarderror)标准错误 接下来我们debug一下文件 文件会给我们stdout的地址而且每次都会变化 libc是c函数库它会被加载在进程空间 运行后产看内存
之前介绍过了gdb 与 pwndbg,这里做pwn题目演示就用pwndbg了
pwngdb在调试对调试堆的数据结构时候很方便
peda在查找字符串等功能时方便

安装pwndgb
1
2
3
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
sudo ./setup.sh

切换:

vim ~/.gdbinit

image1注释掉peda 保存

首先先gdb调试启动程序
gdb -r ret2libc

r

先查看下内存

vmmap

image2

其中后缀为.so文件为libc 虽然地址每次都会变化但是它的偏移量是不会变化的 我们先调试一下 我们先下一个断点在printf

…ToDo….