NOTES
USER PWN
exp template
123456789101112131415161718192021222324252627282930313233343536373839404142#!/usr/bin/env python#_*_coding:utf-8_*_from pwn import *local = 1debug = 1binary = "./main"lib = "/lib/x86_64-linux-gnu/libc.so.6"elf = ELF(binary)context.log_level = "debug" if debug else "info"if local: p = process(binary) libc = ELF(lib)else : p = remote("ip","port") # lib = "./libc-2.27.so" libc = ELF(lib)s ...
userfaultfd
seccon2020 - kstack1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961 ...
2021-西湖论剑-PWN & 2021-BCTF-PWN
2021-西湖论剑string_go12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697#!/usr/bin/env python#_*_coding:utf-8_*_import timefrom pwn import *local = 1debug = 1binary = "./string_go"lib = "/lib/x86_64-linux-gnu/libc.so.6"elf = ELF(binary)context.log_level = "debug" if debug else "info"if local: p = process(binary) libc = EL ...
编写自己的驱动
一些Kernel 知识
内核的各个模块
LKMLKM(loadable kernel module),内核作为一个那么复杂,庞大的系统,如果每次产生新的设备,更新新的驱动都要把源码加到内核再重新编译,明显是不太现实。所以呢,LKM也就千呼万唤始出来了。
设备分类按照LDD3的说法,分为三种设备Character devices block device network device。这只是一些比较抽象的分类,各个设备在编写驱动时肯定在逻辑设计上有交叉。
Character devices
A character (char) device is one that can be accessed as a stream of bytes (like a file); a char driver is in charge of implementing this behavior. Such a driver usually implements at least the open, close, read, and write system calls. The text con ...
SCTF-PWN
说下我的情况,做出了dataleak和gadget,至于kernel那道,明显的uaf,当时确实没那个能力做得出。
dataleak
听其他师傅说是某个cve,出题师傅用心了。
payload : echo "AAAAAAAAAAAA/*AAAA /*AAAAA /* /*" | ./cJSON_PWN(echo "AAAAAAAAAAAA/*AAAA /*AAAAA /* /*";cat) | nc ip port
思路
源码分析
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410 ...
长安战役 PWN
大体说下,pwn1拿了一血,pwn2拿了第四,pwn3拿了二血。前些日子的抑郁,一直没勇气再做pwn题,等到恢复好了就直接搞kernel去了,这次比赛只是为了试验下自己。
pwn1
是2.23的stack overflow,但是sp指针的切换方式不太一样
12345678910111213141516.text:0804859E mov ecx, [ebp+var_4].text:080485A1 leave.text:080485A2 lea esp, [ecx-4].text:080485A5 retn.text:080485A5 ; } // starts at 8048559/*leave :mov esp,ebppop ebp栈迁移有时用到它ret :pop rip*/
实际没必要研究具体的切换方式,使用padding溢出,看最终esp和padding中字符串有啥关系,再相应调整padding。
123456789 ...
C++ Pwn
长安战役-pwn4
明显的UAF,思路就是劫持__free_hook
现在还没有了析c++的内存管理,从做题的过程来说,在new分配时不止会malloc一次,类似采用了某种数据结构,chunk的某一部分需要维持这种数据结构所以size没有那么准确。在delete时,也可能不只free一次。这应该说在malloc和free之上采用某种系统而形成了new和delete。
类似整体看,在new一个chunk之前,会先有一个较大的unsorted bin,每次分配从中切割一块。这使得泄露时就可先delete填满tcache之后,再次delete合并入unsorted_bin,之后在FD和BK域就可看到libc的地址。
漏洞点
123456789101112_DWORD *__fastcall del(info *this){ if ( this->key )//------------------------------------------- operator delete[](this->key);//---------------------- ...
kernel学习
收集信息
内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, intel cpu提供Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部 分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运 行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。
12345$ uname -aLinux ubuntu 4.15.0-142-generic #146~16.04.1- ...
莲城杯pwn
这个我们队拿到了第四,当然也是并列第一,其中的pwn是我代为解出来的。说实话不太难,pwn也拿到血了。
free_free_free
利用unsorted bin的指针残留,爆破stdout,1/16的可能。
利用fastbin 错位先申请到stdout-0x43,后申请到malloc_hook-0x23。
利用realloc调节栈帧,one-gadget获取shell。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990#!/usr/bin/env pythonfrom pwn import *local = 0debug = 0binary = "./free_free_free"lib = "/lib/x86_64-linux-gnu/libc.so.6&q ...
鹤城杯pwn
共5题,当时没有参加,师傅给的附件自己做的,调休这两天课都是满的,只能找零碎的时间做。不过这也是第一次能把pwn自己做完。
littleof有个点就是最后使用system("/bin/sh");获取不成功,确实听说过这种情况,不过可以使用exevce来获取shell,我就直接用syscall来恶心它了;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#!/usr/bin/env pythonfrom pwn import *local = 1debug = 0binary = "./littleof"lib = "/lib/x86_64-linux-gnu/libc.so.6"elf = ELF(binary)context.log_level = "debug" if debug else "i ...