Execute
문제로 주어진 파일을 실행하면 입력을 받고 입력받은 값이 저장된 위치를 출력해주는 것으로 보인다. 파일 재실행시 address로 추정되는 값들이 바뀌는 것으로 보아 해당 값을 leak해준뒤 이를 기반으로 exploit을 작성해야 할것같다.
Analyze
보호기법을 확인해보면 아무것도 안 걸려있는 것을 확인 할 수 있다.
Main
- Line 13 : scanf함수를 통해 s변수를 입력 받는다. 이때 \n을 파라미터로 주어 \n도 입력 받는다.
- Line 15~26 : for문으로 앞서 execute에서 확인했던 것처럼 s[i]의 address를 leak해주고 s배열 속에 든 값을 출력해준다.
- Line 29 : do while문의 탈출 조건으로 scanf의 return값이 0이 아니고 v5가 ‘y’혹은 ‘Y’가 아닐 때 까지 루프를 수행한다
scanf함수는 입력 값의 길이에 대한 검증을 진행하지 않으므로 여기서 buffer overflow를 트리거 할 수 있다.
IDA를 통해 함수 목록을 살펴보면 shell을 실행시켜줄 만한 함수가 보이지 않는다. 따라서 shellcode를 직접 메모리에 올려 문제를 풀어야 할 것 같다. 앞서 mitigation에서 nxbit가 풀려 있었으므로 충분히 가능할 것이다. 따라서 shellcode를 배열 s에 올린 후 return address를 leak된 s배열의 시작주소로 덮어 쓰면 성공적으로 shell을 얻을 수 있을 것이다.
Solve
먼저 사용할 shellcode는 웹상에 있는 24byte shellcode를 사용할 것이다..
unsigned char code[] = \
"\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
이제 buffer overflow를 위한 dummy를 계산해보자.
s배열의 크기가 128byte로 내가 생성한 shellcode보다 큰 것이 확인되고 ebp-0x88위치에 존재하는 것이 확인된다. 따라서 shellcode 뒤에 이어 붙일 dummy의 크기는 0x88-24임으로 112byte이다.
결과적으로 payload의 구성을 다음과 같다.
Shellcode(24byte)+dummy(112byte)+sfp(4byte)+leak된 s의 주소
여기까지의 결론으로 exploit을 작성해보자.
성공적으로 shell을 획득하고 flag를 확인 할 수 있다
'Wargmae > HackCTF' 카테고리의 다른 글
[Hack CTF - yes or no] (0) | 2021.01.09 |
---|---|
[Hack CTF - BOF_PIE] (0) | 2021.01.09 |
[Hack CTF – x64 Simple_size_BOF] (0) | 2021.01.05 |
[Hack CTF – x64 Buffer Overflow] (0) | 2021.01.05 |
[Hack CTF – 내 버퍼가 흘러넘친다!!!] (1) | 2021.01.03 |