티스토리 뷰

 

 

카테고리

PWNABLE


문제

main()

passcode.txt를 읽은 값과 사용자의 입력 값이 같아야 sub_8048756 함수를 호출 할 수 있다.

passcode.txt를 읽은 값은 s2, 사용자의 입력 값은 s1에 들어가는데 0x28 바이트 크기의 s1에 0x50 바이트의 입력을 넣을 수 있어 s2로 overflow가 발생한다.

Overflow를 이용하여 s2의 값을 조작할 수 있으므로 passcode.txt를 몰라도 우회가 가능하다.

 

sub_8048756()

sub_8048756 함수로 들어오면 네 가지 메뉴가 있다.

echo는 입력한 문자열을 출력해주고, man은 메뉴를 출력해주고, exit는 프로그램을 종료한다.

여기서 중요한 건 root_auth 메뉴이다.

s = &v4

root_auth

read

root_auth 함수의 반환 값이 0이 아니라면 s+=100 을 통해 스택의 주소를 증가시킨다.

s는 원래 v4의 주소(bp-0x8c)를 가리키고 있었는데 이 주소가 증가하게 되면 bp-0x28을 가리키게 되고, 버퍼의 크기가 줄어들었기 때문에 read함수에서 overflow가 발생한다.

 

root_auth_8048A28()

sub_8048ABD()

함수 내부로 들어오면, passcode를 입력하고 입력한 passcode를 sub_8048ABD 함수로 넘겨준다.

sub_8048ABD 함수에서는 passcode에 XOR 연산을 거쳐 어떤 문자열과 일치하는지 확인한다.

과정을 살펴보면, passcode를 앞 부분(dest)과 뒷 부분(src)으로 분리한 후 각 부분의 j번째 자리의 수와 상수를 XOR하여 새로운 뒷 부분을 만들고, 뒷 부분의 글자는 앞 부분으로 옮긴다.

이 과정을 4번 반복한다. ( i<=3 )

XOR 과정

이전의 src가 다음의 dest가 되므로 결과 값 중 앞부분(dest)이 XOR 를 거치기 이전의 src인 것을 알 수 있다.

v6은 0x10101010이라는 초기값에서 v6 ^= 2 * v6 을 거치므로 어떤 값이 오는지 알 수 있다.

v2 = 2*v6 ^ src[j] ^ dest[j] 중 v2, v6, src를 알고 있으므로 dest를 구할 수 있다.

이 과정을 4번 반복하면 입력해야 할 passcode를 구할 수 있다.

 

stack canary

스택의 위치를 올려 overflow를 발생시킨다 해도 한 가지 문제가 남아있다.

바로 stack canary이다.

stack canary는 echo 메뉴를 이용하여 Leak 시켜서 간단하게 우회할 수 있다.

문제에서 라이브러리가 주어져 있기 때문에 그 다음은 ROP를 이용하여 공격한다.

 

EXPLOIT

* XOR 구하기


* 공격 코드


'해킹 > CTF' 카테고리의 다른 글

[2016 POX CTF final] watch out (150) write-up  (0) 2016.11.12
[2016 POX CTF final] xorxor (200) write-up  (0) 2016.11.12
asdf  (0) 2016.09.14
[WhiteHat Contest 12] Pwn001 write-up  (2) 2016.09.11
[WhiteHat Contest 12] Misc002 write-up  (1) 2016.09.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함