본문으로 바로가기

ROOT-ME CHALLENGES - CRACKING : 4 ELF C++ 0 PROTECTION

category War-Game/Root-me 2019. 4. 3. 13:22

Root-me Cracking 4번 문제입니다.

이번 문제는 C++ 언어로 작성된 ELF 파일 분석 문제입니다.

이번 문제도 역시 패스워드를 찾는 문제이군요.

Start the challenge 버튼을 누르면 ch25.bin 파일을 다운로드 받습니다.

 

어떤 동작을 하는지 먼저 살펴봐야겠군요.

 

바이너리 파일 뒤에 인자값이 없으면 password 인자를 넣으라고 출력하네요.

패스워드 1234를 입력한 후 실행하면 역시 패스워드가 틀렸다고 나오네요.

 

IDA pro 를 이용하여 동작방식을 분석해보죠.

 

프로그램 메인함수 Graph view 입니다.

변수 선언 및 스택크기 조절

입력 인자값이 있는지 비교하여 0보다 크면 loc_8048AEE 주소로 이동합니다.

 

 

 

프로그램 실행 시 입력한 패스워드 인자값과 flag 패스워드 값을 비교하여

jz 분기문을 통해 패스워드가 맞는지 비교하여 틀리면 Password incorrect.

맞으면 Bravo, Congratz. 두 줄의 문장을 출력합니다.

 

패스워드 값을 찾아내기 위해 gdb를 이용하여 바이너리 파일을 분석합니다.

 

IDA 에서 분석하였던 인자값 비교를 통해 인자값이 존재하면 

main+104로 이동합니다.

 

쭉 내려오다보면 call 0x8048cf7 에서 string값을 compare한 후

test al, al 코드를 통해 조건 분기문을 위해 값을 비교합니다.

맞으면 je 0x8048be5<main+351>로 이동하여 정상 패스워드 입력 시에

출력하는 문자열들이 출력됩니다.

 

b *0x8048b92, b *0x8048b97 두 주소에 브레이크 포인트를 걸어 확인해봅니다.

 

 

0x848cf7 주소로 step in 해보니 std::string::compare를 통해 

문자열을 비교합니다.

 

continue 명령을 통해 다음 브레이크 포인트에서 

esp 에 저장된 값을 확인해보죠.

0xbffff3e5 주소에 저장된 0xbffff64b를 string으로 확인해보니

패스워드로 입력했던 "1234"가 저장되어있네요.

4바이트 낮은 주소인 0xbffff3f4를 확인해보니 정상 패스워드가 여기에

저장되어있었네요.

 

 

Congratz. 미션 클리어~!