ctf(pwn&reverse)总结

0x01 PWN

checksec下载安装

git clone https://github.com/slimm609/checksec.sh.git
sudo ln -s /xx/xx/checksec /usr/local/bin/checksec  #建立软链接,源地址需要是绝对路径

ida

F5/tab 查看伪代码
空格 查看汇编代码
视图->打开子视图->字符串 :查看所有字符串
编辑->修补程序 :修改程序 修改完后点击修补程序应用到输入文件即可保存修改

python pwntools

安装 :pip install pwntools
环境:ubuntu python64位
调试:context(os='linux', arch='amd64', log_level='debug') 32位时改为i386
导入外部lib:from ctypes import *
ex:使用c的rand函数
libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
libc.srand(1)
libc.rand()
  • sendlineafter("在什么字符串后面发送数据",要发送的数据)
  • ljust(num,b'a') 补全payload,使长度为num字节
  • recvlineuntil() 可以截取收到内容中想要的数据
  • asm(shellcraft.sh()) 生成shell,使用前需要用context声明环境
  • elf=ELF(filepath) 解析elf文件,输出checksec数据
  • 使用p32等 from pwnlib.util.packing import p32

pwn

汇编转机器码
from pwn import *
context.arch='i386' #指定架构
print(asm('mov eax, 0'))

gdb

  • gdb filename :调试某个文件
  • info reg 查看寄存器的值
  • info args:打印当前函数参数名机值
  • info frame:打印当前函数的栈信息
  • info locals:打印当前函数所有局部变量及值
  • c(continue):继续执行/n(next):单步跟踪/s(step):步入
  • ni/si都是汇编级别的断点定位。si会进入汇编和C函数内部,ni不会。
  • start:重新启动程序
  • x /8gx:以16进制 输出8个64位数
    x /10x $sp:输出当前堆栈栈顶往下10个栈里的值
  • set $edx=0x12 修改寄存器的值
  • set args in/test.mp3 设置程序的参数
    show args 显示设置的参数
  • r < test.txt 从标准输入进行读取,先创建一个文件
  • p 变量名 查看变量在内存中的位置及值
    p/x $rax 查看rax寄存器里的值
  • disa main 查看main函数的反汇编代码
  • bt 查看调用栈
  • gdb ./test core 调试core文件

    设置断点 
    1、b *0x111111  : 在0x11111处下断点,记得前面要加*
    2、b func_name
    3、b /src/codefile.cc:81。gdb将在运行到源码文件/src/codefile.cc的第81行中断
    删除断点
    delete [断点编号]
    查看断点
    info break

pwndbg

git clone https://github.com/pwndbg/pwndbg
cd pwndbg
sudo #./setup.sh

命令

  • parseheap 展示堆结构
  • fastbins fastbins指针

pwn

  • 将汇编转成机器码
    from pwn import *
    context.arch='i386' #指定架构
    print(asm('mov eax, 0'))

questions

  • 遇到执行elf文件提示没有那个目录或文件
    解决:
    Ubuntu 32位库的安装:
    ubuntu64位默认没有32位的库,所以32位的ELF文件无法执行,会提示找不到文件或者文件夹,所以需要手动安装32位的库。
    sudo apt install libc6-dev-i386
    sudo apt-get install lib32z1
  • 实验不同版本的glibc,patchelf和glibc-all-in-one
    https://blog.csdn.net/qq_4156...

0x02 reverse

elf文件upx脱壳 :kali下 upx -d 源文件 -o 目标文件

0x03 汇编知识点

1、32位计算机常用寄存器
image.png

2、标识寄存器
image.png

0x04 深度拓展

gdb原理

https://mp.weixin.qq.com/s/te...
1、gdb ./a.out

以这种方式直接运行时,首先,gdb解析a.out文件的符号。接下来我们输入 run 命令,gdb通过 fork() 一个新进程,然后通过 ptrace(PTRACE_TRACEME, 0, NULL, NULL); 设置traceme模式。最后执行 exec 启动加载要调试的文件。

2、attach pid

在调试PWN题时,通过attach pid来追踪要调试的进程。gdb通过执行 ptrace(PTRACE_ATTACH,pid, 0, 0) 来对目标进程进行追踪。

3、gdb server的target remote

在gdb+qemu调试内核时,经常用到target remote来attach到qemu上对vmlinux进行调试。二者之间有特殊的定义好的数据信息通信的格式,进行通信。

4、汇编转化成机器码 调试测试写好的汇编
https://www.cnblogs.com/ZIKH2...

你可能感兴趣的:(安全asm逆向工程)