728x90
반응형
목차
1. Easy ELF 실습
  - 실습을 위한 사전 단계(Linux 파일 실행)
2. 분기문 분석
3. byte 및 배열 정리
4. 소스코드 작성(어셈블리어 기반)

[Review] (4주차) 이론 - 총정리

2022.07.19 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse

sarahee.tistory.com


1. Easy ELF 실습

ELF 파일은 리눅스의 실행파일이므로, 실행시킨 후 랜덤 문자를 입력

Wrong 출력

파일 확장자를 모든 파일(All Files (*))로 변경

2. 분기문 분석

실행 후 View > Open subviews > Strings (or Shift + F12)

문자열 검색

리눅스 실행 시 조회된 문자열(Reversing.Kr Easy ELF, Wrong) 및 정답 출력 예상(Correct) 조회

Wrong 해당 그래프 모드 확인

Wrong graph

cmp를 통해 분기문 이동

jump if not zero(not equal) → eax가 1이라면(빨간색 화살표), Correct 연결

레지스터나 메모리 값을 변경하지 않고, 플래그 레지스터에만 영향을 줌

* flag register: 상태 레지스터

Correct graph

분기문 지나기 전 call 링크 두개

sub_8048434

sub_8048451

eax가 1이 되기 위해서는, 모든 분기문에서 조건 점프(초록색 화살표 이동)하여, 우측 하단으로 차례 이동

3. byte 및 배열 정리

첫 번째 조건문

byte_804A021의 값과 31h 비교

 

두 번째 조건문

byte_804A020을 eax에 저장하여,

첫 번째 문자(eax 내)와 0x34 XOR 연산

 

세 번째 문자(byte_804A022)와 0x32 XOR 연산

네 번째 문자(byte_804A023)와 0x0FFFFFF88 XOR 연산

다섯 번째 문자(byte_804A024)와 0x58 값이 같은지 비교

 

네 번째 조건문

테스트

 

네 번째 조건문

세번째 문자(byte_804A022)와 0x7C 비교

 

다섯 번째 조건문

첫번째 문자(byte_804A020)와 0x78 비교

 

여섯 번째 조건문

네번째 문자(byte_804A023)와 0x0DD 비교

No. CODE XREF 어셈블리어 10진수 to 문자(ASCII) 순서
1 sub_804851B+2A↓p cmp     al, 31h 0x31 = 49, chr(49) = 1 byte_804A021
2 sub_8048451+C↑j
loc_8048469
xor     eax, 34h
xor     eax, 32h
xor     eax, 0FFFFFF88h
cmp     al, 58h
0x34 = 52, chr(52) = 4
0x32 = 50, chr(50) = 2
0x88 = 136, chr(136) = (enter)
0x58 = 88, chr(88) = X
byte_804A020
byte_804A022
byte_804A023
byte_804A024
3 sub_8048451+4E↑j
loc_80484A8
test     al, al    
4 sub_8048451+60↑j
loc_80484BA
cmp     al, 7Ch 0x7C = 124, chr(124) = | byte_804A022
5 sub_8048451+72↑j
loc_80484CC
cmp     al, 78h 0x78 = 120, chr(120) = x byte_804A020
6 sub_8048451+84↑j
loc_80484DE
cmp     al, 0DDh 0xDD = 221, chr(221) = Ý byte_804A023

 

정리해보면, input 문자열은 다음과 같이 구성 (^: XOR)

input[0] ^ 34h = 78h

input[1] = 31h

input[2] ^ 32h = 7Ch

input[3] ^ 88h = DDh (byte이므로 88 앞의 FFFFFF는 무시)

input[4] = 58h

input[5]는 test(세 번째 조건문)

4. 소스코드 작성(어셈블리어 기반)

// string
ans = ""

ans += chr(0x34 ^ 0x78)
ans += chr(0x31)
ans += chr(0x32 ^ 0x7C)
ans += chr(0x88 ^ 0xDD)
ans += chr(0x58)

print(ans)

 

출력: L1NUX

Correct! 정답 출력

 

 

728x90
728x90

+ Recent posts