티스토리 뷰
카테고리
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 |