바이너리 파일만 띡 던져줌
하면서 느낀 게 여태는 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도 그런 거인 듯.