상세 컨텐츠

본문 제목

[Write-up] Level 18

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

by RACC8N 2019. 12. 9. 19:10

본문

HINT : attackme의 소스코드

 

코드에서 중요한 부분을 보면 프로그램 실행 시 stdin으로 1바이트씩 읽고 있는데,

 

입력이 0x08인 경우 count의 값이 감소한다.

 

count는 배열 string의 index를 가리키며, 

 

만약 입력이 정상적인 입력인 경우 string[count] = x 를 해주고 count를 증가시킨다.

 

이제 gdb로 분석해 보자.

 

우선 각 버퍼의 위치를 확인해 보자.

 

소스코드와 gdb를 통해 유추해 보면,

 

ebp-124 = check , ebp-128 = x, ebp-132 = count 인 것 같다.

 

적당히 if 분기문에 breakpoint를 걸고 A를 입력하여 어디서 부터 쓰여지는지 확인 해 보았다.

 

ebp-120이 string의 시작 주소임을 알 수 있다.

 

정리해 보면,

 

ebp - 132 = count

ebp - 128 = x

ebp - 124 = check

ebp - 120 = string[]

 

우리는 check를 0xdeadbeef로 바꿔주어야 하는데,

 

string이 check 보다 밑에 있어 일반적인 bof방법으로는 string을 통해 check를 덮어 쓸 수 없다.

 

여기서 우리는 코드에 count를 감소시키는 로직이 있음을 알고있다.

 

따라서 count를 음수로 만들어 string이 음수 인덱스를 갖게 되면, check의 메모리 영역을 덮어 쓸 수 있을 것이다.

 

string 부터 check 까지의 크기는 4바이트 이므로, 

 

0x08을 4번 하고 deadbeef를 넣어 주면 될 것 이다.

 

이제 level 19로 올라가 보자.

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

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

관련글 더보기

댓글 영역