[ HackCTF ] - Pwn - Basic_BOF #1
* 주관적인 공부 방법과 풀이로 되어있습니다. 만약 처음이신 분들은 궁금하신게 많을 거라 생각이 되고 잘하시는 분은 제 풀이의 문제점과 추가 보충할 점을 잘 알거라 생각이 됩니다. 제 공부를 위해 질문과 문제점을 댓글로 해주시면 감사하겠습니다.
[풀이]
1. 문제를 hackctf 사이트에서 다운로드를 해줍니다.
2. 리눅스 환경에서 파일을 열어 봅니다. 권한을 chmod 777로 다 풀어놨습니다.
실행시 입력을 받습니다. 저는 aaaa를 입력해봤습니다.
3. [buf]부분에는 제가 입력한 값이 있고 [check] 부분은 hex값이 있습니다.
4. gdb명령어를 이용해서 어셈블리로 분석해봅니다.
5. 그림으로 흐름을 표현해 봤습니다. (fgets()함수 실행 까지의 부분)
입력은 예로 aaaa를 입력했습니다.
fgets 함수에 푸쉬된 eax레지스터 값입니다. 0x61 == a 입니다(아스키 코드값)
6. 이젠 비교문인 cmp와 j(n)e를 통해 문제를 해결해 봐야합니다.
현재 ebp-0xc부분엔 0x04030201이 들어있습니다. 따라서 je를 통해 <main+120>부분의 코드로 넘어갑니다.
만약 같지 않다면 다음 부분인 0xdeadbeef와 ebp-0xc부분을 비교하고 같다면 je를 통해 <main+120>부분의
코드로 넘어가게됩니다. 뒷부분에 핸드레이를 진행할 예정으로 잘 기억해 주세요!
7.이젠 <main+120>부분의 코드를 봐야합니다.
ebp-0xc부분과 0xdeadbeef를 비교하고 이번엔 jne으로 같지 않다면 <main+177>로 점프를 시킵니다.
(출력문 하나 내고 끝나는거 같음)
같다면 밑으로 코드인 puts()를 통해 출력 한줄을 하고, system()을 실행시킵니다(쉘실행)
8. 따라서 ebp-0xc부분 전까지 임의 값으로 체우고 0x4030201부분을 0xdeadbeef 값으로 덮어 쓰면 해결 될 문제 입니 다.
payload를 짜고 nc로 넘겨줍니다. ls로 파일의 유무를 확인해 주고 cat을 통해 파일을 읽어들입니다.
-핸드레이-
1.함수가 call되기전 push되는 값은 인자값일 것이다. 따라서 printf@plt call되기전인 0x8048610을 x/s로 확인해 보고 비슷하게 만들었습니다.
2. 입력받는 부분 fgets()에서 stdin,0x2d,eax순으로 인자(?)가 push 됩니다.
3. 그다음 중요한 비교, 점프문을 c로 구현을 하자면 조건문이 될 거 같습니다. 비교문중 처음(같다면 점프하는 두 부분)을 묶어서 조건을 만들고, 넘어간 다음 비교하는 조건문(if문)을 이용해서 이번엔 같지 않다면 점프하게 구현을 했습니다.