Easy ELF

A small Linux ELF that XORs input against a fixed table before comparing it to the stored password.

2026.08.18 Reversing original post

Easy ELF, 리눅스 환경에서 실행시켜야 함. 대충 어떤 식으로 파일이 실행되는지 보자. 그 후 아이다에서 정적 분석을 하겠다.

대충 문자열 찾기로 어떤 식의 프로그램인지 훑었다. Correct 와 Wrong 같은 문자열이 있는 걸로 봐서는, 아마 패스워드 같은 걸 확인해서 참 여부를 결정하는 프로그램 같다.

Figure 1

Figure 2

위에 큰 regular function 쪽을 보면 지속적인 cmp 와 jmp 를 반복하는 곳을 발견할 수 있다. 이곳을 디버깅하면 패스워드를 알 수 있을 것 같다.

Figure 3

자세히 분석해보면, 이건 전형적인 “입력 문자열을 한 바이트씩 변형(XOR)한 뒤 특정 값과 비교하는 검증 루틴” 인 걸 알 수 있다.

첫 분기를 보자. byte_804A021 == '1' (0x31) 이면 다음 단계 진행, 아니면 바로 실패 경로. 입력의 특정 위치(아마 index 1)가 문자 1 이어야 한다는 걸 알 수 있다.

2번째 파트는 중요하다. 여기서는 byte_804A020 을 읽고 0x34 와 XOR 한 결과를 다시 byte_804A020 에 저장하는 걸 볼 수 있다. 여기서 byte_804A020input[0] 이다. 두 번째 연산에서도 똑같이 input[2] ^= 0x32 해준다.

여기서 0FFFFFF88h 가 조금 특이하게 보이지만, 저장되는 건 al 즉 하위 1바이트이다. 그래서 실제 효과는 input[3] ^= 0x88 이다. 변형이 끝나면 바로 다시 비교가 이어진다: input[4] == 'X'.

Figure 4

또 여기서 test al, al 는 “0인지 검사” 이다. 0이면 ZF=1 → jz 로 점프. 즉 [0]~[4] 가 문자, [5]\0 인 걸 알 수 있다.

그 후 다음 블럭에서 주의할 점은, 여기서 비교하는 값들은 모두 이미 앞에서 input[2] ^= 0x32 처럼 변형해서 다시 저장해둔 상태라는 거다. 즉 비교되는 값은 “변형 후 값” 이다. 조건은:

input[2] == '|' XOR 0x32
0x7C XOR 0x32 = 0x4E = 'N'
→ input[2] = 'N'

또 다음은:

input[0] == 'x' XOR 0x34
0x78 XOR 0x34 = 0x4C = 'L'
→ input[0] = 'L'

또:

input[3] == 0xDD XOR 0x88
0xDD XOR 0x88 = 0x55 = 'U'
→ input[3] = 'U'

우리가 확정한 조건들을 정리하면:

input[0] = 'L'
input[1] = '1'    (초입 비교에서)
input[2] = 'N'
input[3] = 'U'
input[4] = 'X'
input[5] = '\0'   (문자열 종료)

즉 최종 입력 문자열은 L1NUX 이다.