Google後發現CNC 的language是"G-Code"
再Google "G-code interpreter online",發現這個網站不錯用
https://ncviewer.com/
會進資料後發現flag
picoCTF{num3r1cal_c0ntr0l_68a8fe29}
先測試一下基本功能,可以做買賣,但想買flag會說錢不夠
再測試個幾次,發現買負個商品,前會變多,於是可以買flag
轉換後看到flag
先看func
func:
sub sp, sp, #32 #sp=sp+32
str w0, [sp, 12] #*(sp+12)=w0=user input
mov w0, 58 #w0=58
str w0, [sp, 16] #*(sp+16)=58
mov w0, 2 #w0=2
str w0, [sp, 20] #*(sp+20)=2
mov w0, 3 #w0=3
str w0, [sp, 24] #*(sp+24)=3
ldr w0, [sp, 20] #w0=*(sp+20)=2
ldr w1, [sp, 16] #w1=*(sp+16)=58
lsl w0, w1, w0 #w0=w1<<w0,w0=58*2**2
str w0, [sp, 28] #*(sp+28)=w0=58*(2**2)
ldr w1, [sp, 28] #w1=*(sp+28)=58*(2**2)
ldr w0, [sp, 24] #w0=*(sp+24)=3
sdiv w0, w1, w0 #w0=w1/w0=58*(2**2)/3
str w0, [sp, 28] #*(sp+28)=w0=58*(2**2)/3=77
ldr w1, [sp, 28] #w1=*(sp+28)=58*(2**2)/3
ldr w0, [sp, 12] #w0=*(sp+12)=w0(user)
sub w0, w1, w0 #w0=w1-w0=58*(2**2)/3-w0(user)
str w0, [sp, 28] #*(sp+28)=w0=58*(2**2)/3-w0(user)
ldr w0, [sp, 28] #w0=*(sp+28)=58*(2**2)/3-w0(user)
add sp, sp, 32 #sp=sp+32
ret #return
.size func, .-func
可以整理成
stack + 12 = user input
stack + 16 = 58
stack + 20 = 2
stack + 24 = 3
stack + 28 = 77
在看主程式,請看註解
.LC0:
.string "You win!"
.align 3
.LC1:
.string "You Lose :("
.text
.align 2
.global main
.type main, %function
main:
stp x29, x30, [sp, -48]!
add x29, sp, 0 #x29=sp+0
str w0, [x29, 28] #*(x29+28)=w0
str x1, [x29, 16] #*(x29+16)=w1
ldr x0, [x29, 16] #x0=*(x29+16)=w1
add x0, x0, 8 #x0=x0+8
ldr x0, [x0] #x0=*(x0)
bl atoi
str w0, [x29, 44] #*(x29+44)=w0
ldr w0, [x29, 44] #w0=*(x29+44)
bl func
cmp w0, 0
bne .L4 #w0 != 0跳到.L4就會跳到.LC1=>lose
adrp x0, .LC0 #希望跳到.LC0(win)=>w0 = 0
add x0, x0, :lo12:.LC0
bl puts
b .L6
.L4:
adrp x0, .LC1
add x0, x0, :lo12:.LC1
bl puts
重點是w0 = 0而看回func最後58*(22)/3-w0(user)希望為0,那w0須為58*(22)/3=77轉成16進位==>(4d),並照題目說的格式補0==>picoCTF{0000004d}