[드림핵] simple-operation 기드라로 프로그램 처음 분석해보기

janequeen·2024년 5월 30일
0

chapter01 simple-operation 솔플


문제 파일을 다운 받은 뒤

기드라로 main 함수 디컴파일 한 사진입니다.

디컴파일 된 코드들을 읽어보니...

a0b4c1d7을 비교해서 값이 같으면 Congrats!를 출력해주고 puts(local_18);을 통해 read(local_1c,local_18,0x45);로 flag 값을 읽어온다는 것을 알았습니다.

다음 반복분을 보니 역순으로 바꿔서 나온 값이 local_42 = a0b4c1d7 가 되어야 합니다.

따라서 local_39 = 7d1c4b0a 가 되어야 하고 snprintf로 받은 local_10도 7d1c4b0a의 값을 가져야 합니다.

정리하면

local_39 = 7d1c4b0a
local_10 = 7d1c4b0a

여기를 보면 입력값과 랜덤으로 출력된 값을 XOR 연산하고 있습니다. XOR의 특징인 a^b = c, a^c = b 를 이용해서

7d1c4b0a = local_2c(입력값 무엇을 입력해줘야 될지 모름) ^ local_30(랜덤 출력값)을

다음고 같은 형태로 바꿔줄 수 있습니다.

local_2c(입력값 무엇을 입력해줘야 될지 모름) = local_30(랜덤 출력값) ^ 7d1c4b0a

그러므로 랜덤 출력값과 7d1c4b0a XOR 연산한 값을 구해주면 flag를 구할 수 있습니다.

저는 값을 16진수로 넘겨주면 되겠지 하고 이것 저것(리틀엔디안...) 시도해봤지만 실패했습니다.

분명 풀이는 맞는데 왜 안 될까 고민하다가 힌트를 조금 봤습니다. ㅠㅠ

chapter02 simple-operation 힌트 조금 봤음


다음 코드에서

__isoc99_scanf(&DAT_00102034,&local_2c);

이 부분을 보면 scanf 함수인 것을 알 수 있습니다. 여기에서 제가 놓친 부분은 바로 &DAT_00102034를 확인하지 않은 점 입니다.

DAT_00102034 부분을 기드라 Listening에서 확인해보면 %d가 보입니다.

즉, __isoc99_scanf(%d,&local_2c);로 해석했어야 됐습니다.

이를 통해 10진수 값을 보내주면 문제를 해결할 수 있다는 사실을 깨달았습니다.

계산기로 풀었습니다.

-봤던 힌트-

https://h4ck.kr/?p=461

이 한 문장 봤습니다. ^^

chapter03 문제 풀면서 든 잡다한 생각...


[드림핵] simple-operation 아 그리고 이 문제는 일정시간이 지나면 연결이 끊깁니다.

XOR 특징 이용한 문제는 초보자 리버싱문제에서 꼭 나오는 것 같아요.

저는 환경 세팅이 다 된 상태에서 풀지는 않아서... pwntools 사용을 못했습니다. 그래서 시간안에 수동으로 타이핑 쳐야 됐는데... 힘들었습니다. ㅠㅠ 또, 맥북은 검색해보니까 pwntools 사용이 어려운 것 같습니다.

예전에 pwntools 사용법을 조금 익혔는데... 앞으로 공부할 때는 소켓 프로그래밍으로만 문제를 풀어보고 싶기도 해요. 간지나기도하고 도구 의존도를 낮추고 싶네요.

아직, pwntools의 interactive()나 리틀엔디안 32bit, 64bit 패킹해서 데이터 보내는 법은 소캣프로그래밍만으로 어떻게 하는지 잘 모르겠어요... 찾아보면서 실력을 늘릴 계획입니다.

분석도구로 기드라를 쓴 이유는... 그냥 써보고 싶었습니다. 기능 하나도 모르고 써보는 중입니다.

또, 지금은 좋은 리버싱 툴로 디컴파일까지 자동으로 해줘서 코드를 보기 편했지만 앞으로 문제풀 때는 어셈블리어만 보고 어떤 식으로 흐름이 진행되는지 학습해볼 필요가 있는 것 같아요.

뭔가, 디컴파일 해준 코드만 보면서 계속 문제 풀면... 재미없잖아요.

0개의 댓글