Easy ELF
A small Linux ELF that XORs input against a fixed table before comparing it to the stored password.
Easy elf , 리눅스 환경에서 실행시켜야함. 대충 어떤식으로 파일이 실행되는지 보자. 그후 아이다에서 정적 분석을 하겠 다.대충 문자열 찾기로 어떤식에 프로그램인지 훑었다. Correct 와 wrong 같은 문자열이 있는걸로 봐서는, 아마 패스워 드 같은걸 확인해서 참 여부를 결정하는 프로그램 같다.


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

자세히 분석해보면, 이건 전형적인 입력 문자열을 한 바이트씩 변형(XOR)한 뒤 특정 값과 비교하는 검증 루틴 인걸 알수 있다. 첫분기를 보자. byte_804A021 == ‘1’ (0x31) 이면 다음 단계 진행. 아니면 바로 실패 경로. 입력의 특정 위치(아마 index 1)가 문자 1 이어야 한다는걸 알수있다.
2번 째 파트는 중요하다. 여기서는 byte_804A020을 읽고 0x34와 XOR 결과를 다시 byte_804A020에 저장하는걸 볼 수있다. 여기서 byte_804A020을 는 input[0] 이다. 두번째 연산에서도 똑같이 input[2] ^= 0x32 해준다.
여기서는 여기서 0FFFFFF88h가 조금 특이하게 보이지만, 저장되는 건 al 즉 하위 1바이트이다. 그래서 실제 효과는 input[3] ^= 0x88 이다 변형이 끝나면 바로 다시 비교가 이어진다. input[4] == ‘X’.

또 여기서 test al, al는 “0인지 검사” 이다. 0이면 ZF=1 → jz로 점프. 즉 [0]~[4]가 문자, [5]가 \0 인걸 알수있다. 그 후 다음 블럭에서 주의할 점은 여기 비교하는 값을 모두 다이미 앞에서 input[2] ^= 0x32로 변형해서 다시 저장해둔 상태이 다는거다. 즉 비교되는 값은 “변형 후 값”이다. 즉 조건은:
input[2] == '|' XOR 0x32
0x7C XOR 0x32 = 0x4E
0x4E = 'N'
input[2] = 'N'
또 다음은:
input[0] == 'x' XOR 0x34
0x78 XOR 0x34 = 0x4C
0x4C = 'L'
input[0] = 'L'
또:
input[3] == 0xDD XOR 0x88
0xDD XOR 0x88 = 0x55
0x55 = 'U'
input[3] = 'U'
우리가 확정한 조건들을 정리하면:
• input[0] = 'L'
• input[1] = ‘1’ (초입 비교에서)
• input[2] = 'N'
• input[3] = 'U'
• input[4] = 'X'
• input[5] = ‘\0’ (문자열 종료)
즉 최종 입력 문자열은: L1NUX 이다.