본문 바로가기

카테고리 없음

Pwnable.kr [flag]

바이너리 파일만 띡 던져줌

 

하면서 느낀 게 여태는 BOF 문제나 풀었는데, 아예 리버싱이라고 생각하니 느낌이 많이 달라서 힘들었음

 

어제 몇 시간정도 삽질하면서 프로그램 실행 흐름을 파악한 결과

반복적으로 계속 바이트를 옮기는, 문자열로 만드는 듯한 행위를 파악했으나

정확히 스트링 형태로 나오지가 않았음

 

그러다가 위 사진의 cmp 문들이 flag 값을 변화시키고 그로 인해 실행 분기가 계속 갈라지는데,

일반적인 형태로는 수십번 반복해도 잘 가지 않는 분기들을 파악하였다. 

 

그래서 gdb set으로 reg값을 임의로 바꿔서 실행 분기를 틀어보았고

 

다음 사진과 같은 내용을 얻을 수 있었다. 

 

 

이거 솔직히 진짜 메모리 다 뒤지고 삽질해서, 거기다가 풀려고 만들어진 문제니까 이렇게 얻을 수 있었는데,

원래 더 스마트하게 구하는 방식이 있는지 포스팅 후 다른 사람 답 찾아보겠음

 

저것도 한 번에 딱 저 문자열을 구하진 못했고, 보다시피 문자열로 보이는 것을 발견,

offset 변경하면서 전체 문자열을 구하는 형태로 진행했음

 

어쨌든 여기까지 한 이후에는 

UPX 다운로드 받아서 언패킹 하고

다시 gdb 키면 

 

따란~

 

이런 아주 친숙한 코드가 나옴. 친절하게 주석으로 flag라고도 해놨으니

mov까지 진행한 후 x/s $rdx하면 플래그 얻을 수 있음

 

참고로 여태까지 그래왔듯이 앞으로도 불친절하게 답은 안 알랴줌

 

내가 나중에 봐도 또 풀 수 있게 도와주는 역할의 포스팅 하는 게 목적이니까.

 

추가

답을 한 10개 정도 뒤져봤는데,

1. strings flag (linux 명령어인데 좋은 거 배움) -> 이건 $info 전체 다 나옴

2. ida에서 나왔던 스트링의 일부 upx.net \n였나? 그거만 보고 upx 의심

3. exeinfo 프로그램 이용해서 upx 패킹 확인

크게 이렇게 나눠졌음

고로 내가한 건 우선 삽질은 맞음. ㅎ 연습은 된 듯...

 

아 그리고 원래 UPX 패킹일 경우 section 정보를 보면 거기 UPX라고 적힘

근데 이 문제는 그 부분은 바꿔 놓은 상태 

 

그래서 추가적인 분석이 필요함.

 

멘토님께서 추천해주신건 여러 패킹 바이너리를 종합 분석해주는 도구를 이용하는 것

위에 exeinfo도 그런 거인 듯.