본문 바로가기
System Hacking/해커스쿨 F.T.Z Hacking Zone

해커스쿨 F.T.Z Level 15

by En_Geon 2020. 2. 26.

level 15 로그인 후 hint를 본다.

 

level 15 hint

 

level 14와 같은 코드지만 "int *check" 변수 check의 변수가 포인터로 쓰여있다.

이것은 변수 *check가 가리키는 주소에 0xdeadbeef가 들어있는지 봐야 한다.

 

C 코드 분석은 level 14에서 했으므로 생략하고 gdb를 열어본다.

 

level 15 gdb attackme

 

main+3에서 0x38(56)byte만큼 공간을 확보하고 main+17에서 ebp-56의 주소를 eax에 넣은 뒤 fgets 함수를 call 한다.

main+29에서 ebp-16의 주소를 eax에 넣고 그 결과를 main+32에서 0xdeadbeef와 비교한다.

이 사이에 *check 변수의 주소를 찾아 먼저 넣어주면 BOF가 일어나게 된다.

 

여기서 level 14와 같은 크기로 ebp-56에서 비교문은 ebp-16에 있으니 거리는 40byte 떨어진 곳에 있는 것이다.

 

이 문제는 포인터 변수의 주소를 gdb로 어떻게 찾는지 알면 쉽게 풀리는 문제다. 

 

더보기

 

gdb로 각각의 주소를 찾는 방법은 "x/16x main"으로 찾을 수 있다.

"x/16x main"에서 16은 숫자 16을 뜻하고 main에서부터 16byte까지 출력하는 명령어다. 숫자는 원하는 만큼 나올 수 있게 변경할 수 있다.

 

x/16x main

 

이렇게 보게 되면 main+32에서 "0xbeef3881", "0x2575dead"가 있는 걸 볼 수 있다.

main+32를 자세히 보게 되면 그 주소를 찾을 수 있다.

 

main+34

 

"x/x 주소"를 입력하면 그 주소에 해당하는 데이터를 볼 수 있다.

주소는 16진수로 하나씩 올려가면서 볼 수 있다.

이렇게 0xdeadbeef의 주소를 찾았으면 공격하면 된다. 

 

공격 실행

 

위에서 말했듯이 level 14와 비슷하지만, level 14에서는 "0xdeadbeef" 문자와 비교했다면 level 15에서는 "0xdeadbeef"가 들어있는 주소를 입력해주어야 한다.

'System Hacking > 해커스쿨 F.T.Z Hacking Zone' 카테고리의 다른 글

해커스쿨 F.T.Z Level 17  (0) 2020.02.27
해커스쿨 F.T.Z Level 16  (0) 2020.02.27
해커스쿨 F.T.Z Level 14  (0) 2020.02.24
해커스쿨 F.T.Z Level 13  (0) 2020.02.24
해커스쿨 F.T.Z Level 12  (0) 2020.02.23

댓글