상세 컨텐츠

본문 제목

[Write-up] Level 20

Pwnable Write-Up/01.hackerschool F.T.Z

by RACC8N 2019. 12. 10. 15:17

본문

HINT : attackme의 소스코드

 

FTZ의 마지막 문제이다. 

 

코드를 보면 stdin으로 부터 입력 받은 문자를 fgets 함수를 통해 bleh에 저장한다.

 

이런 bleh를 printf로 출력하게 되는데,

 

일반적으로 사용하는 printf("%s", bleh)가 아닌 그냥 printf(bleh)를 하게 된다.

 

이는 Format String Bug를 발생시킬 수 있다.

 

Format String Attack 방법은 구글링하여 잘 찾아보자.

 

우선 gdb로 분석 해 보자.

 

main 함수를 보려고 하는데 main함수를 찾을 수 없다고 한다.

 

이런 경우에는 main 함수가 어디있는지 직접 찾아줘야 한다.

 

먼저 함수의 정보를 확인해봤다. 

 

__libc_start_main 이란 함수가 있으므로, 저 주소에 break point를 걸고 run 해 봐았다.

 

그리고 lic_start_main을 보면, jmp ds:0x80495b0을 볼 수 있다.

 

0x80495b0은 실제 libc_start_main 실행 주소 인 것 같으니 분석해보자.

 

libc_start_main 함수의 실행 인자 값들이다.

 

여기서 call 바로 위에 있는 0x80483b8은 찾고있던 main함수의 시작 주소일 것이다.

 

확인해 보자.

 

main 함수를 찾았다. 이제 FSB를 위한 정보를 알아 보자.

 

먼저 printf의 작동 원리를 봐보자.

 

main함수 시작점과 printf 호출 다음에 break point를 걸고 확인해 보았다.

 

printf의 인자로 0xbffff710이 들어가게 되는데 이는 bleh을 가리키고 있는 주소 이다.

 

그리고 printf의 인자 위치부터 main 함수의 bleh 위치까지 12바이트의 쓰레기 값이 있는것을 알 수 있다.

 

즉 printf의 인자 위치 부터 4번째 위치에 그 값이 있음을 알 수 있다.

 

확인 해본 결과 AAAA는 printf의 인자로 들어가며 이 AAAA가 들어 있는 위치는 4번째 자리이다.

 

자 그럼 이제 FSB를 이용하여 우리가 원하는 주소에 우리가 원하는 실행을 할 수 있도록 값을 변조 해 보자.

 

main의 ret에 덮어도 되지만 dtors라는 개념이 있다.

 

그렇다고 한다.

 

그럼 attackme의 dtors를 찾아보자.

 

0x8049594임을 알 수 있다. 

 

그렇다고 한다.

 

따라서 여기서 +4를 해준 값 0x8049598 값을 쉘코드로 바꿔보자. 

 

payload는 다음과 같다.

 

(python -c 'print "\x98\x95\x04\x08"+"aaaa"+"\x99\x95\x04\x08"+"aaaa"+"\x9a\x95\x04\x08"+"aaaa"+"\x9b\x95\x04\x08"+"%08x"*2 +"%20x"+"%n"+"%190x"+"%n"+"%257x"+"%n"+"%192x"+"%n"';cat) | ./attackme

 

FSB는 열심히 노가다 하면 된다.

 

모든 Level을 끝냈다.

'Pwnable Write-Up > 01.hackerschool F.T.Z' 카테고리의 다른 글

[Write-up] Level 19  (0) 2019.12.10
[Write-up] Level 18  (0) 2019.12.09
[Write-up] Level 17  (0) 2019.12.07
[Write-up] Level 16  (0) 2019.12.07
[Write-up] Level 15  (0) 2019.12.07

관련글 더보기

댓글 영역