工具

IDA+pwndbg+pwntools+...

IDA

先祭上神器

pwndbg

这个比peda好用一点。推荐。

  • stack 100 查看栈信息
  • heap -h 查看堆(需要更全的heap插件可以看libheap,不过这个基本够了)

gdb自定义hook(这里自定制用,其实pwngdbg自带就完全足够了)

define hook-stop
>info registers
>x/24wx $esp
>x/2i $eip
>end

pwntools

具体网上一堆教程如:pwntools使用,这里就是个人整理一点

p = process('./pwnfun') # 挂载进程
elf = ELF('./pwnfun') # 看到的结果就和checksec一样
p.interactive()  # 弹shell
context.log_level = 'debug' # 挂进程之后显示各种调试信息
  • DynELF这个用来leak十分好用,不过leak格式比较难写,有点迷
  • elf.got['puts'] 这个少用,也有点迷,用ROPgadget(见下文)代替比较好

checksec(pwntools中也有)

CANARY    : 覆盖返回地址基本不可利用
FORTIFY   : 一种安全机制
NX        : 堆栈不可执行
PIE       : 攻击时需要泄露地址
RELRO     : Partial: 不可修改strtab
Full      : 程序装载时填充got表

ROPgadget

ROPgadget --binary ./pwn --only "pop|ret" | grep rdi

metsploit

msfconsole
msf >
show payloads: 显示所有渗透模块
use linux/x64/exec: 使用linux x64 模块
set cmd /bin/sh
generate -t py -b "/x00":产生shellcode /xXX的形式

redare2(要用的话再积累 IDA更加方便)

aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze len bytes of instructions for references (aar)
[x] Analyze function calls (aac)
s sym.main:运行到main处
pdf:打印汇编
odd [strings]: 给参数来运行程序
dc: 运行程序
db: 下断点
dr: 查看所有寄存器信息
VV: 查看调用关系视图
afvn [name] [name]: 重命名,类似ida的n

echo disass main | gdb ./[program]  利用管道来调试
"\41\xffABCD".encode('hex'
set disassembly-flavor intel    设置为x86汇编显示

Complie

  • gcc
    -fno-stack-protector// 去除栈保护 如 gcc -m32 -g -fno-stack-protector -z execstack -o vuln vuln.c
    
  • nasm
    nasm -f elf -o vlun.o vuln.asm   //编译
    ld -m elf_i386 -s -o vuln vuln.o vuln.o  //链接
    ./vuln 运行
    

一些姿势

连接

ssh [email protected] 用来连接目标主机
scp [email protected] [filename] [dir]
scp -P2222 [email protected]:/home/passcode

程序加载追踪

ltrace
strace

测试

主要看socat用法

socat tcp-listen:12345 exec:./stack_overflow 把程序放到本机运行
socat tcp-listen:22333,reuseaddr,fork system:./pwnme 保持程序一直执行
nc 127.0.0.1 12345 本地测试连接

Centos 相关

centos可能默认开了防火墙 所以端口都是关闭的 但是关闭防火墙又不太好,所以开放对应端口就好了

  • 通过命令开启允许对外访问的网络端口(这里是23333):
    /sbin/iptables -I INPUT -p tcp --dport 23333 -j ACCEPT
    /etc/rc.d/init.d/iptables save 
    /etc/rc.d/init.d/iptables restart 
    /etc/init.d/iptables status// 查看端口是否开放
    

加载信息

info proc map 查看各个库加载信息然后寻找 "/bin/sh" 字符串
strings: 查看文件中可见字符串
strings -a -t x /lib32/libc.so.6 | grep "/bin/sh"
objdump -d stack7 | grep "ret" 可以用来查找ret指令
objdump -x [filename] 打印头文件信息以及区段信息
objdump -T libc.so | grep gets

查找gadgets

ROPgadget --binary level4 --only "pop|ret" 
ROPgadget --binary libc.so.6 --only "pop|ret" | grep rdi
objdump -d ./level5
__libc_csu_init这个函数里找 ROP
objdump -d -j.plt pwn | grep write 查找write函数地址

Konwledge

QAQ 栈主要就是找溢出和rop等

覆盖x86_64 ret libc

执行call操作时栈内已经存放了传递的变量,call将当前地址压入栈中,作为返回地址,然后执行jmp到指定函数位置。构造call system时可以利用这个先存放一个地址,然后跳转。

ROP

基础技能了,不过自己经常是会忘,都要照着汇编来看参数传递顺序≧ ﹏ ≦

dl-resolve

姿势有点高端:),读取内存。需要了解一下加载过程。(学二进制不知道文件加载过程和咸鱼有什么区别(^_^))

附上文章uaf_io find system

double free

想进入二进制的门槛都要会heap。然而我好像撞死在门槛上了。/(ㄒoㄒ)/~~

一些坑

ret & call

ret 后面必须是 .plt
__libc_init 里用call来必须是 .got的(具体LCTF pwn-100那个)

leak函数

DynELF需要leak函数,这个有一些技巧,有一个总结的链接挂了。简单来说就是主要puts,write,printf这几个函数的区别

关于DynELF

有一定的成功率,不过如果网速或者服务器不过关,这个方法并不是很好,dl-resolve相对易成功一点。baidu杯那个不知道是不是这个原因QAQ

其他的坑

to be continued

resources

pwnable

主要linux elf为主 比较适合开拓思路和入门,做过一点,不过因为懒,有点荒废了

配上writeup-riskgray食用更佳

io

还没来得及看,主要是有arm的

LiveOverFlow

youtube有相关视频 从他的视频学了不少

CTF writeup

各种writeup (大多国外),感觉国内各ctf都参照了很多国外的比赛

CTFer-bin

resource recommand

各种资源,看了晕

DEF CON

知名hacker团队

tisiphone

推送多 有心得体会系列文章可以看看

results matching ""

    No results matching ""