0ctf_2017_babyheap
单独写了篇文章,方法是fastbin attack
wustctf2020_closed
常用文件描述符
- stdin:0
- stdout:1
- stderr:2
程序流程
关闭了输出流和错误流,然后直接给了shell,但是没有输出。
方法:
stdout重定向
简单来说,既然stdout的文件描述符不可用,可以对stdout重定向,将文件描述符 stdout(1)重定向到可用文件描述符 stdin(0)
1 | exec 1>&0 |
actf_2019_babystack
1 | winter@ubuntu:~/buu$ checksec ACTF_2019_babystack |
actf_2019_babystack
吐了,,,思路一样,不对
程序流程
最多可以输入0xe0个字节,但是s在rbp-0xd0。
故最多可以溢出rbp和返回地址,所以需要栈迁移。
程序给了栈地址,直接在栈上布置即可。
rbp:fake stack
ret:leave_ret
完整exp
自己不知道哪里错了,,,直接用师傅的exp
1 | from pwn import * |
picoctf_2018_shellcode
最简单的ret2shellcode题,把shellcode发过去就行。。。
难点
唯一的难点应该在于main函数不能反汇编,得看汇编。
vuln函数就是输入再打印。
所以,程序流程就是输入数据,并且会直接改数据。
1 | from pwn import * |
picoctf_2018_got_shell
程序流程
能给任意地址写入四个字节数据,32位。
而且给了后门函数,直接修改puts的got表位win的地址即可。
注意一点:发送数据应该发送的是整数,也就是hex(),而不是p32(),它是字符。
exp
1 | from pwn import * |
mrctf2020_easy_equation
一道格式化字符串,,,,不知道为什么用pwntools工具不好使,,,
程序流程
输入字符串,格式化字符串
一个判断,满足判断即可获得shell
1 | for judge in range(200): |
1 | winter@ubuntu:~/buu$ python equation.py |
故只要judge为2即可。
漏洞利用
利用格式化字符串将judge的值变为2即可。
方法:
1 | "bb%9$naaa"+p64(judge) |
8不是9
8
只发送了0xf个字节,到1的时候就没了,,,后门的并没有发送过去。。
1 | "bb%8$n"+p64(judge) => 将%8$n之前的字节数,也就是2,写入到offse=8的位置,也就是%8$n后面的judge |
9
发送了12个字节,都发送过去了。
1 | "bb%9$naaa"+p64(judge) => 将%9$n之前的字节数,也就是2,写入到offse=9的位置,因为偏移为8,而judge前面刚好9个字节,一开始就少一个,所以offset=9的位置刚好在前面九个字符之后。 |
emmm,字节对齐?
exp
1 | # for judge in range(200): |
picoctf_2018_can_you_gets_me
静态文件,用ropchain就行,类似于这道题
1 | winter@ubuntu:~/buu$ file PicoCTF_2018_can-you-gets-me |
栈溢出,18个字节
1 | ROPgadget --binary PicoCTF_2018_can-you-gets-me --ropchain |
完整exp
1 | #!/usr/bin/env python2 |
inndy_echo
格式化字符串
程序流程
有一个循环,格式化字符串漏洞,多次利用
程序中调用了system函数
漏洞利用
- 利用格式化字符串修改printf的got为system函数的plt表
- 发送‘/bin/sh’即可。
完整exp
1 | from pwn import * |
suctf_2018_basic pwn
最简单的栈溢出
偏移量为0x110
后门函数:/bin/cat
执行该函数能直接打印flag
完整exp
1 | from pwn import * |
oneshot_tjctf_2016
程序流程是:可以泄漏一个地址,然后可以跳到任意一个地址
方法:泄漏puts的got表地址,计算libc地址,然后跳到one_gadget即可。
完整exp
1 | from pwn import * |
cmcc_pwnme1
栈溢出
有后门函数
故得exp
1 | from pwn import * |
但是环境原因,flag在/home/ctf下面的flag或者flag.txt,所以没有拿到flag
常规做法
- 泄漏libc地址
- 找到system和binsh
- 栈溢出
1 | from pwn import * |