277 字
1 分鐘
SecurityFocus June Homework
Q1 : Bit操作
C程式開發 & Bit 操作a = 12, b = 9 請撰寫一個程式找出以下四值
a AND ba OR ba XOR bNOT a#include <stdio.h>
int main() { int a = 12; int b = 9; printf("%d\n", a & b); printf("%d\n", a | b); printf("%d\n", a ^ b); printf("%d\n", ! a); return 0;}Q2 : 自己出題-Reverse
出題實作請你出一道題目並解出自己的題目,需求如下
無法在正常流程下取得 Flag,需要分析或逆向使用 C 語言進行開發file : https://drive.google.com/drive/folders/1cWibFgH6kgvomZ7URLGztjcnxsGAodUb?usp=sharing
解題步驟

要給正確的密碼

沒什麼奇怪的upx之類的,直接丟進IDA

可以發現,他是使用check_password這個涵式去做判斷

推斷:
將輸入的字串,每個字元的ASCII碼-1,並返回其是否等於"Lx^@0R2^e?hKdc^P@P"
寫一個簡單的程式
passWord = "Lx^@0R2^e?hKdc^P@P"for c in passWord: print(chr(ord(c)+1),end = '')

flag : FLAG{My_A1S3_f@iLed_QAQ}
Q3 : 組合語言分析
找出能夠成功跳到 paradise 的值,並簡單說明
section .text global _start
_start: mov eax, 0x03 mov ebx, ??? mov ecx, 0x3eb3ac03 mov edx, 0x3eb3ac03 jmp _loop
_loop: test eax, eax jz check add ecx, edx dec eax jmp _loop
check: cmp ebx, ecx je paradise mov eax, 0 jmp end
paradise: mov eax, 1 jmp end
end: ret讓我們寫上註釋:
section .text global _start
_start: mov eax, 0x03 mov ebx, ??? mov ecx, 0x3eb3ac03 mov edx, 0x3eb3ac03 jmp _loop
_loop: test eax, eax //if(eax==0) jz check //true -> check add ecx, edx //ecx+=edx dec eax //eax-=1 jmp _loop //loop()
check: cmp ebx, ecx //eax == ecx? je paradise //true mov eax, 0 //otherwise -> eax = 0 jmp end //return 0
paradise: mov eax, 1 jmp end
end: ret觀察後,發現
- loop的結束條件為
eax = 0,而eax初始值為3,且回圈內每次eax-- - ->
for(int eax = 3 ; eax >0 ; eax--) - 執行了三次
ecx+=edx - ->
paradise的跳轉條件為ebx = ecx
那我們叫出python幫我們計算吧

得到結果 : ebx為0xfaceb00c,可以跳轉到paradise
Q4 : 自己出題-pwn
首先,連進去看看問題

分析問題:
- 問題為丟給你一個涵式,並執行100次提問,每次提問會給定x,須回答f(x)
- 經過多次測試,f(x)不變,100輪也固定
- 會限時間,大約20秒
觀察規律後,寫個pwn的小程式
from pwn import *
r = remote('localhost',12345)r.recvlines(4)
for i in range(100): r.recvline() r.recvuntil("x = ") x = int(r.recvline().strip()) res = 5*x*x + 3*x - 1 r.sendline(str(res))print(r.recvline())r.interactive()r.close()
flag : FLAG{Ar3_y0u_@_nnath_ma1ter_0r_h@ck2r}
部分資訊可能已經過時









