Problem
We found this program, but we're having some trouble figuring it out. What's the value of %eax when the last instruction (the NOP) runs?
Hint
You may want to convert the assembly into some equivalent C code, which will be easier to read!
ㅁ 문제 정보
문제 유형 | Reverse Engineering |
문제 타입 | ASM |
문제 난이도 | 하 |
ㅁ 문제 상세분석
# This file is in AT&T syntax - see http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm # and http://en.wikipedia.org/wiki/X86_assembly_language#Syntax. Both gdb and objdump produce # AT&T syntax by default. MOV $119,%ebx MOV $28557,%eax MOV $8055,%ecx CMP %eax,%ebx JL L1 JMP L2 L1: IMUL %eax,%ebx ADD %eax,%ebx MOV %ebx,%eax SUB %ecx,%eax JMP L3 L2: IMUL %eax,%ebx SUB %eax,%ebx MOV %ebx,%eax ADD %ecx,%eax L3: NOP |
[그림 1] 문제 내용
문제 풀이 방법은 여러 가지 방법이 있지만 여기에서는 어셈블리 언어를 C언어 소스 코드로 작성해서 풀었다.
AT&T 문법을 익숙한 INTEL 문법으로 변경해서 분석을 진행했다. Att2Intl 도구를 사용하면 AT&T 문법을 INTEL 문법으로 변경할 수 있다.
[그림 2] Att2Intl 실행
MOV ebx, 119 MOV eax, 28557 MOV ecx, 8055 CMP ebx, eax JL [L1] JMP [L2] L1: ; basic label IMUL ebx, eax ADD ebx, eax MOV eax, ebx SUB eax, ecx JMP [L3] L2: ; basic label IMUL ebx, eax SUB ebx, eax MOV eax, ebx ADD eax, ecx L3: ; basic label NOP |
[그림 3] INTEL 문법
AT&T 문법을 INTEL 문법으로 변경하기 위해서 ATT2INTL 실행해서 문법을 변경한다. 1행 ~ 3행에서 값을 레지스터로 이동시키고 CMP ebx, eax를 진행하고 조건 분기를 진행한다. JL 조건문은 ebx가 작을 경우에 분기하는데 ebx 값에 119값이 들어가 있고 eax에는 28557 값이 들어가 있기 때문에 L1으로 점프한다. L1에서는 곱셈과 더하기를 진행하고 마지막에 ecx 값(8055)를 뺀다.
[그림 5] 문제 결과
어셈블리 언어 분석 결과를 C언어로 작성하고 실행하면 Flag 값을 알 수 있다.
'Wargame & CTF > picoCTF 2014' 카테고리의 다른 글
[Reverse Engineering] Function Address (0) | 2015.12.17 |
---|---|
[Reverse Engineering] Cyborg Secrets (0) | 2015.12.15 |