目前我所遇到的一些pwn的做题技巧
我也是偶尔玩玩ctf,所以也不会很难的,所以这篇主要是帮助刚开始学习的人学习吧
首先知识点包括:栈,堆,整数溢出,格式化字符串
目前ctf的题越来越偏向于实际,有的会使用刚刚爆出来的CVE漏洞的,所以不能只局限于glibc
所以可以大体分为两类把:libc,kernel
栈利用:有ret2libc,ret2shellcode,ret2text,ropchain,ret2syscall,brop,srop等等,当然有时候还会有seccomp的只能使用ORW系统调用
堆利用:fastbin dup,FSOP,house_of_force,house_of_sprit,off_by_one,off_by_null,tcache dup,UAF,unlink,unsorted bin attack等等
格式化字符串:32,64位的区别,注意00截断就行了,所以大概区别就是地址放前面和地址放后面的区别了
然后就是比较新的了,像iot的,qemu的,kennel的
qemu就是虚拟机模拟指令,然后会在某些指令上存在上述libc的漏洞(还是会转到libc)
iot的我做的比较少,改天在做到了在写吧
kernel的,像我们所知道的,Windows下面需要加载驱动然后通过派遣函数,io控制码来进行调用
Linux下的叫做LKM,和Windows下的类似,ioctl来使用,然后利用通常是通过
1、commit_creds(prepare_kernel_cred(0))
2、modeprobe_path 劫持:mode模块劫持(suid提权)利用低权限用户目录下可被Root权限用户调用的脚本提权
3、task_struct 劫持 + prctl(要求任意地址写,任意地址读)
然后是例题把
ret2libc:主要是为了绕过NX
题目可以在buuctf下载
(简单题)jarvisoj_level3,jarvisoj_level4,,(好几种解法)cmcc_pwnme2
ropchain:inndy_rop
ret2text:bjdctf_2020_babystack2(so easy),jarvisoj_test_your_memory
ret2syscall:
32位: 传参方式:首先将系统调用号 传入 eax,然后将参数 从左到右 依次存入 ebx,ecx, edx, esi, edi, ebp寄存器中,返回值存在eax寄存器 调用号:sys_read 的调用号 为3 sys_write 的调用号 为 4,sys_execve :0xb 调用方式: 使用 int 80h 中断进行系统调用
64位: 传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右
依次存入 rdi,rsi,rdx,rcx,r8,r9寄存器中,返回值存在rax寄存器 调用号:sys_read 的调用号 为0
sys_write 的调用号 为 1 sys_execve 的调用号 为 59 sys_sigreturn 的调用号 为 15
且执行完之后rax保存返回值,rcx保存下一条指令的地址 调用方式:syscall/sysenter
cmcc_simplerop(这个题还可以使用mprotect方法的哦)
ret2shellcode:
(64位)mrctf2020_shellcode,jarvisoj_level1(这个也有不同方法呢,而且当时我远程的时候会出现没有数据的情况,解决这样的情况就是1.防止数据粘连,2,自己的数据发送接收是否有问题)
SROP,ret2csu_init:ciscn_2019_s_3(这个题可以使用SROP和ret2csu来做)
https://note.youdao.com/s/MJLDyFUZ
BROP:axb_2019_brop64
概念讲解:
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/medium-rop/(哈哈中等ROP技术)
:https://www.anquanke.com/post/id/196722#h2-11
栈迁移:(当你看到只能溢出ebp/rbp 和 return_addr的时候就要考虑使用这个方法了)
ciscn_2019_es_2:32位的(原理在笔记里)
actf_2019_babystack:64位的https://note.youdao.com/s/4wR8MJb7
seccomp:SECCOMP-pwnable_orw:笔记
[极客大挑战 2019]Not Bad:笔记
哦对了还有利用canary机制泄露地址的,wdb2018_guess:笔记
我还记得有个canary跟格式化字符串结合,然后通过三级指针来修改地址的,但是我找不到了
然后还有只有汇编代码的,这种题一般会比较偏怪,mrctf2020_shellcode_revenge:笔记
总结:其实大概就是先泄露地址,然后修改返回地址,或者got地址(然后触发)
这里是分割线-----------------------------------------------------------------------------------
堆的:
先来个简单的增加一些自信:babyfengshui_33c3_2016(应该不用放讲解把:笔记)wustctf2020_easyfast
off_by_one(包括off_by_null):
这种一般是通过构造unlink或者是修改size制造堆块堆叠:笔记
2.27:ciscn_2019_es_4:https://note.youdao.com/s/SDxnhifH
2.23:roarctf_2019_easy_pwn,(2.23还是挺多的)
2.29及以上2.31:介绍:题目的话参考最新的i春秋的第三道pwn题(比赛唯一做出来的一道pwn…我不知道怎么上传这个文件)
house_of_storm:基础知识学习:bugku simple_storm:笔记这个网上都没有write up呢,可以拿去bugku里面赚赚积分呢哈哈哈
house-of-spirit-[ZJCTF 2019]EasyHeap
知识点
只要top chunk size够大,就能随意申请chunk所以,如果有溢出能控制top chunk size,就可以修改其为-1(0xffffffff最大值),然后malloc(负数)可以向上申请,malloc(正数)
hitcontraining_bamboobox(三种方法可以做这道题哦)
gyctf_2020_force(这个只有一个add函数可以使用,但是思路并不难)
FSOP:知识介绍
高版本里面已经不适用了呢
wdb_2018_1st_babyheap(也两种方法啊)
UAF:gyctf_2020_some_thing_exceting,ciscn_2019_n_3(so easy),npuctf_2020_easyheap
其实也就是制造堆块堆叠啊或者是修改指向地址啊之类的
unlink:axb_2019_heap,hitcontraining_bamboobox
总结:其实就是利用前面的一些技术,构造堆块堆叠啊之类的,泄露地址,可以修改got就修改,不能修改就修改hook函数,前面那个只有一个add函数的堆题,就是很好的例子(malloc->malloc_hook–>realloc–>realloc_hook–>free_hook),最后触发就行了
这里是分割线----------------------------------------------------------
格式化字符串:32,64位:inndy_echo(32位)inndy_echo2(64位)
64位的时候修改一般都是修改后三个字节:如果有循环就不用计算偏移了,分三次写就行了,如果没有循环需要一次性写入三个,类似如下的格式
payload1 = b'%' + bytes(order[b[0]]) + b'c%12$hhn'
payload1 += b'%' + bytes(order[b[1]]-order[b[0]]) + b'c%13$hhn'
payload1 += b'%' + bytes(order[b[2]]-order[b[1]]) + b'c%14$hhn'
payload1 = payload1.ljust(32, b'a')
payload1 += p64(printf_got+b[0]) + p64(printf_got+b[1]) + p64(printf_got+b[2])
但是呢不好保证第三个比第二个大,第二个比第一个大,第三个比1+2还大,所以就写两次,第一次写最低一字节,第二次写两字节
payload1 = b'%' + str(b-9) + b'c%12$hhn' #-9是repeater:字符个数
payload1 += b'%' + str(a - b) + b'c%13$hn'
payload1 = payload1.ljust(32, b'a')
payload1 += p64(printf_got+2) + p64(printf_got)
上面这个代码是:解axb_2019_fmt64的
然后还有非栈上的格式化字符串bugku pwn6 printf
这里是分割线----------------------------------------------------------
qemu的:[OGeek2019 Final]OVM:笔记
kernel的:知识点介绍:CISCN2017 - babydriver
顺便在给一个当时fuzz内核参考的链接吧
有朋友给我说,ctf to learn而不是learn to ctf我觉得挺有道理的。冲
昨天写了一天的docker脚本,终于调好了,就夜里回去了第二天来看,但是忘记吧脚本拿出来就点了还原了,哭唧唧文章来源:https://www.toymoban.com/news/detail-481753.html
继续加油文章来源地址https://www.toymoban.com/news/detail-481753.html
到了这里,关于pwn入门小技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!