I want hacker
Dreamhack - IDA 기본 사용법 본문
IDA
아이다란? 컴퓨터용 디스어셈블러 이다. 디스어셈블러는 기계어 코드로부터 어셈블리어 코드 소스를 생성한다.
이것은 실행 파일과 중앙 처리 장치 그리고 운영 체제를 지원함
즉, 다시 말해, PE파일이나 ELF 파일 같은 어셈블리어 코드를 통해 구동되는 파일들을 디스어셈블하여 다시 어셈블리어로 보여주거나, 디컴파일링 하여, C/C+ 로 보여준다.
하지만 이를 이해하기 위해선 기본적인 어셈블리어의 이해가 있어야 하며, 메모리의 구조도 어느 정도는 알고 있어야 한다.
특히 아이다는 파일을 실행시키지 않고 분석하는 정적 분석과 특정 메모리의 위치까지 break point 를 설정하여 실행시켜 분석하는 동적 분석 모두 하기에 용이하다.
IDA 다운
https://discord.com/channels/1299998583025827850/1302580072414314536/1302580325310005268 여기 들어간 다음 IDA FREE 다운
다만, 이전 버전들과 다르게 무료 버전이여도 라이센스키가 있어야 IDA 실행이 가능함
IDA 다운에 대한 자세한 이야기는 여기선 생략하겠다.
IDA 실행
IDA 를 처음 실행하고 OK를 누르면,

이렇게 뜬다. 원래 Previous 밑의 파일들은 처음 실행했으면 안뜨는게 정상인데, 나는 이 글을 작성하기 전 실행했던 적이 있어서 나타난다.
지금부터 우리가 분석해볼 파일은 내가 직적 드림핵을 공부하고 만든 문제인 hello.c의 실행파일인 a.out을 분석해보겠다.
hello.c 는 흔히 아는 helloworld 를 출력하는 프로그램이 아닌 내가 직접 플래그를 적고 만들어봤다.
리버싱 문제에선, 문제의 소스코드를 제공하면 답을 제공하는 것과 마찬가지므로, 맨 마지막에 소스코드는 공개하겠다.
ida에 a.out을 올려보자 참고로 a.out은 우분투 환경에서 gcc 컴파일러로 만든 실행파일 이므로 ELF 파일이다.
파일을 올려본다

파일을 올리면 이렇게 뜬다. 그냥 OK 누르자
딱 IDA를 실행하면 밑과 같은 화면이 나올 것이다.

IDA는 고급 프로그램 답게, IDA 전용 뷰를 제공한다. 이 뷰에서는 함수별로 어셈블리어 동작 순서를 순서도화 시켜 보여준다(흐름 캐치하기 쉬움)
맨 우축의 FUNCTIONS는 이 프로그램이 사용한 모든 함수들을 볼 수 있다.
먼저, 프로그램에서 사용한 문자열들을 쫙 나열한 시트(?) 를 살펴볼 수 있는데 SHIFT + F12 를 눌러보자

문자열들을 살펴보면, printf 와 input, worng, correct 같은 문자열을 확인할 수 있다.
다시 돌아와 main 함수의 디컴파일을 살펴보기 위해, 함수를 선택한 뒤, TAB를 눌려보자

확실히 보기 편해졌다.
input을 printf로 출력한 다음 scanf로 문자열을 받아 256개의 배열이 있는 v4에 저장한다.
IDA에서 각각의 함수들은

이렇게 노란색으로 나타나는데, 파일에서 같은 함수가 여러번 호출될 수 있으므로 다른 곳에서 호출된 위치를 찾고 싶으면, X를 눌러보자 여기서는 호출이 main 함수 한번밖에 일어나지 않았으므로 하나만 나오는 것이다.

하지만 복잡한 문제들은 x 단축키는 필수가 될 수 있다.
직접 함수 내용을 보고 싶으면 해당 함수를 더블클릭을 하면 된다.


true_or_false 함수를 살펴보자
v3는 총 널 문자를 포함하여 22개의 공간이 있고, for문을 통해 만약에 인자로 받은 값인 a1의 순서대로 있는 값이 v3의 배열의 순서 그대로 저장된 값과 같으면, correct!를 출력하고, 그렇지 않다면, wrong을 출력하고 곧바로 함수를 종료시킨다.
v3 배열에는 수들이 있었는데, 그 수들을 입력하면 되었다. 하지만 main 함수에서 입력값을 문자열로 받았으므로 문자열을 ascii 코드로 변환했을 때, 그 숫자에 해당하는 값이 v3의 배열에 있는 값과 일치하면 되겠다.
놀랍게도, ida에서는 해당 숫자에서 r 키만 누르면 문자열로 바꿔준다

따라서 이 함수는 w0w_y3u_a^e_so_g0Od! 라는 값을 입력받으면 correct!를 출력할 것이다. 이것도 ida를 통해 동적분석 해보자
아쉽게도 동적 분석은 안된다... 아마 윈도우 환경이라서 elf 파일은 디버깅이 안되나 보다.
그렇지만, 윈도우 환경에서 exe 파일 동적 분석하는 방법을 살펴보자면,
f2 키를 눌러 원하는 부분까지 실행하겠다는 break point를 걸어준 다음,
f9 키로 디버깅을 할 수 있다.
디버깅을 하면, 그 상태에서 exe 파일은 멈춰 있을 건데, f8키를 누르면 그 다음줄 그 다음줄 순서대로 진행되어 프로그램의 작동 방식을 확인할 수 있다. 단, 디버깅이 끝나기 전까진 프로그램의 동작이 멈춰 있으므로, alt + tab 을 이용해 변화를 관찰해야함. 모든 과정이 끝나면 ctrl + f2 를 누르거나 f9를 누르면 exe 파일이 풀리면서 디버깅의 끝까지 실행된다. 실행 창을 닫으면 모든 디버깅이 종료된다.
프로그램의 소스 코드
#include <stdio.h>
#include <stdlib.h>
void true_or_false(char in[256]);
int main(){
char in[256];
printf("Input: ");
scanf("%s", in);
true_or_false(in);
}
void true_or_false(char in[256]){
int ans[21] = {119, 48, 119, 95, 121, 51, 117, 95, 97, 94, 101, 95, 115, 111, 95, 103, 48, 79, 100, 33};
for(int i = 0; i<21; i++){
if(in[i] != ans[i]){
printf("wrong");
return NULL;
}
}
printf("correct!");
}
정답 : w0w_y3u_a^e_so_g0Od!
'System' 카테고리의 다른 글
| Dreamhack - assembly language (1) | 2024.11.03 |
|---|---|
| Dreamhack - Computer architecture (0) | 2024.11.02 |