ARM분석은 처음해봤는데 베이직이라 그런지 86, x64랑 딱히 다른건 없었다. 그냥 바이너리를 실행시키는데 환경설정이 조금 필요한 정도?
그냥 IDA로 까본다.
메인 로직인것 같다.
s가 인풋인것 같고 v5가 0이 되는 값을 찾으면 되는것 같다.
위의 if ( status != 6 )에서 len이 6이 아니면 종료되므로 s[6]은 0이다.
s[3]^0x72가 0이 되려면 자기 자신과 0x72랑 xor 해야하므로 s[3]은 0x72가 되어야 한다.
이제 s[3] = 0x72인걸로 퍼즐을 맞추면 된다.
if ( s[3] + 1 != *s )이므로 s[0] = 0x73
if ( *s != s[5] ) 이므로 s[5] = 0x73
if ( s[2] + 4 != s[5] ) 이므로 s[2] = 0x6f
if ( s[4] + 2 != s[2] ) 이므로 s[4] = 0x6d
리스트로 정렬해보면 s = [0x73, ?, 0x6f, 0x72, 0x6d, 0x73]가 되는데 s[1]값은 조건이 없다.
그래서 그냥 pwntools로 바이너리를 가져와서 브루트 포스 돌렸다.
그리고 이 바이너리는 인풋이 argv로 들어가는데 그때는 pwntools에서
process(executable='바이너리 이름', argv=['바이너리 이름',인풋값])
으로 넣어주어야 들어간다.
from pwn import *
a1 = 's'
a2 = 'orms'
flag = ''
for i in range(33,127):
flag = a1+chr(i)+a2
p = process(executable='./ch23.bin', argv=['ch23.bin',flag])
a = p.recvline()
check = p.recvline()
# print(a)
if 'Los' not in check:
print(flag)
break
이렇게 돌리면
storms가 flag인것을 알 수 있다.
FLAG = storms