0. 사담

회사에서 혼날때마다 뭔가 공부해야겠다는 맘이 샘솟지만 이상하게 집에만 오면 싹 가라앉는다. 뭔가 블로그에 적고는 싶은데 너무 귀찮긴 하다. 리버싱 스터디때 풀고 풀이를 블로그에 다 적어야지라고 맘 먹었지만 안적어서 많이 밀린 문제 풀이를 적어보려고 한다. 여기는 리버싱이 아니라 IDA랑 코딩만 할 줄 알아도(사실 코딩 없어도 눈치로라도 맞출 수 있는) 그런 문제들 풀이다.

 

그리고 IDA 사용법도 좀 익숙해지거나 다른 디스어셈블러 하나에 정착할 필요를 조금 느끼긴 했다. 기드라나 IDA 둘 중에 하나 골라서 사용법을 좀 정리해 보려고 한다. (기드라로 할 가능성 80%)


1. Handray - 1

입력값에 따른 실행 결과를 예측하여 flag를 제출하라!

입력값 : 65741

 

IDA 사용법을 대충 적으면서 넘어가겠다. 일단 IDA를 키고 분석할 파일을 IDA로 드래그앤 드롭을 하면 이런 창이 나오는데 그냥 아무것도 만지지말고 OK만 눌러주면 된다.

 

 

OK를 누르면 해당 어셈블리어가 나열된 뭔가 뭔가를 볼 수 있다. 맨 위 네모에서 두가지로 나뉘는데 조건 분기를 표현한 것이다. 사실 전에 올리디버그를 사용해서 이런 친절함이 익숙하지 않다. 여기서 F5를 눌러보자

 

 

 

얼마나 놀라운 기능인가! 어셈블리어를 보기좋은 코드로 바꿔주는 기술! 전에 올리디버그만 알았던 시절이였다면 그저 하나하나 해석해가면서 "이런 동작을 하는 프로그램이다!"라고 했겠지만 IDA를 알고있는 지금은 그저 딸깍이다. 그리고 elf 파일이라서 올리디버그로 보지도 못했을거 같기도 한데 그건 잘 모르겠다.

 

위에 코드를 딱 보면 printf로 "odd"랑 "even"을 조건에 따라 출력하는 모습을 볼 수 있다. 눈치가 조금이라도 있으면 홀짝을 구분하는 프로그램인걸 알 수 있다. 그래서 정답은 "odd"라고 유추할 수 있지만 문제에 장난질을 쳤을 수도 있기에 조건문을 살짝 살펴봤다.

 

if((v4&1) != 0)

이것은 무엇을 하는 코드일까? v4를 1과 and 연산하여 0이 아니면 odd를 출력, 반대로 0이면 even을 출력하는 것이다.

홀짝은 숫자의 마지막 비트가 1이면 홀수이고 0이면 짝수이니 1과 어떤 숫자를 and 했을 떄 1이 나올려면 어떤 숫자의 마지막 비트는 1이여야 할 것이다. 이것으로 볼때 문제에 장난질을 하지 않았다는 사실을 알 수 있다.

 

 

__isoc99_scanf(a1: &unk_402004, a2: &v4, a3: envp);

 

추가적으로 바로 위에있는 함수도 확인해 보았다. 함수명에서부터 알 수 있듯 이것은 scanf인 것이다. scanf()는 첫 번쨰 인자로 문자열을 받는 서식을 받는 것이고, 두번째 인자로 해당 서식을 적용한 값이 두번째 인자로 저장되는 함수이다. 숫자를 입력 받을라면 "%d"라는 서식으로 지정해야 하고, v4가 저장될 위치인 것이다. 그래서 &unk_402004를 더블클릭 해보면 "%d"문자열이 저장되어 있는 것을 볼 수 있다.

Hex-View에서도 볼 수 있음

 

뭐 이러쿵 저러쿵 한 말이 많아졌지만 결국 답은 "odd"라는 것이다.

 

 

극적인 마무리를 위해서 linux에서 실행시켜 보았다. odd가 출력되는 것을 볼 수 있다.


2. Handray - 2

2번부터는 빠르게 간다.

입력값에 따른 실행 결과를 예측해 flag로 제출해주세요!

입력값 : 12314831

어떤 값을 입력 받으면 2부터 입력받은 숫자까지 반복문을 도는데 입력받은 숫자랑 돌고있는 반복횟수를 나눠서 나머지가 0이면 false를 출력 전부 돌았는데도 나머지가 0인 수가 없으면 true를 출력하는 것이다.

 

대충 봐도 소수인지 아닌지 판별하는 프로그램인 것이다. (왜 v4/2 이후의 값을 도는지는 모르겠지만..)

계산이 매우 귀찮으니 소인수분해 계산기를 통해서 또는 소수 판별기를 통해 소수인지 알아낸다. 소수가 아니란다. 

정답은 False


3. Handray - 3

입력값에 따른 실행 결과를 예측해 flag로 제출해주세요!

입력값 : GoodMorning!

보면 문자열을 입력받아 15번 반복문을 도는데 각 문자가 97, 101, 105, 111, 117 이면 v6에 카운트를 하나씩 증가시켜 몇개가 나왔는지 마지막에 v6를 출력하는 프로그램이다. 

 

97, 101, 105, 111, 117은 무엇이냐? 소문자 영모음이다. a, e, i, o, u가 몇개인지 보는건데 입력값에는 4개가 있는것을 볼 수 있으니 정답은 4!


99. 후기

자고싶기도 하고 IDA 딸깍하는 문제라서 너무 쉽기도 해서 2, 3번은 너무 대충한 감이 없지않아 있다. 혼나도 집에만 오면 공부할 맘이 싹 가라앉는데 회사에서 안혼나면 공부를 어떻게 하나 싶다. 자주자주 혼나야겠다.

+ Recent posts