-
[Reversing] StaticWargame/HackCTF 2019. 12. 4. 23:50
문제설명
binary를 실행했을 때, Nope.를 띄우고 그대로 종료해버린다. 그래서 어떤 프로그램인지 보려고 gdb를 켰으나..
main 함수가 보이지 않는다.
strings 명령어 결과 분명히 binary를 실행할때 사용한 문자열은 존재하는데 말이다.
접근방법
그래서, __libc_start_main에 breakpoint를 잡고, run시켜보았다.
중점적으로 본 쪽은, 어떠한 주소를 call하는 부분을 보았다.
[rsp+0x18] 을 call 하는 것을 볼 수 있는데, 이 값은
여기서 rdi 로부터 stack에 저장된다. (아마도 rdi에 저장된걸 보면 __libc_start_main의 인자가 아니었을까)
실제로 맞는지 확인해보니 함수의 프롤로그와 스택 메모리 확보 과정을 볼 수 있었다.
즉, 잘 찾아 왔다는 소리였다. 그래서 __libc_start_main+238 에 breakpoint를 걸고 안으로 들어가보았다.
이 함수로 넘기는 인자는 다음과 같다.
스택 메모리 확보 후, 레지스터로 넘어온 인자들을 스택에 저장하는 부분을 거친다.
rbp-0x24 -> 0x1 -> 인자개수 rbp-0x30 -> /root/static -> 파일 경로
그리고 다음과 같이 <getenv> 함수를 이용한 if문을 거친다.
여기서 비교하는 값을 살펴보면,
team_name이라는 환경변수의 값이 bi0s가 되어야 한다.
그러므로 export 명령어를 통하여 문제 조건을 맞춘 후 다시 디버깅 해보자.
다음 조건으로는, 아래와 같이 인자 개수가 2개가 되어야 한다. (./static [인자])
위 2개의 조건을 다 맞추게 되면, 인자랑 팀명 가지고 어떠한 사용자 지정 함수를 호출한다.rbp-0x68 -> "bi0s" rbp-0x70 -> [인자] rbp-0x18 -> 0x0 rbp-0x1c -> 0x0
[rbp-0x40] 에는 다음과 같이 저장된다.
그 후에, 입력받은 인자의 길이가 22인지 검사한다.
인자의 길이가 22고, [rbp-0x40] 에 저장되는 값의 길이도 22 인걸로 보아 아무래도 인자를 encoding 하여,
문자를 비교할려나보다.
이제, 본격적으로 문제가 시작된다.
첫번째로, 스택에 저장된 bi0s를 이용하여 다음과 같은 방식으로 값을 만들어 낸다.
rbp-0x14 -> 0x0 <- iterator 0 ~ 4 (bi0s길이) rbp-0x18 += b, i ,0 ,s <- 0x16e 0x16e * 0x88888889 = 0xc3333333de 상위 4바이트 -> 0xc3 rbp-0x18 = 0xc3 >> 4 <- 0xc 스택은 다음과 같이 정리된다. rbp-0x68 -> "bi0s" rbp-0x70 -> [인자] rbp-0x18 -> 0xc rbp-0x1c -> 0x0
두번째로, 위에서 만들어낸 값(0xc)를 가지고 인자를 encoding한다.
스택은 다음과 같이 정리된다. rbp-0x68 -> "bi0s" rbp-0x70 -> [인자] rbp-0x18 -> 0xc rbp-0x1c -> 0x0 <- iterator 0 ~ 16 짝수일때는 0xc ^ (인자 값 1개 + 0x4) => 결과값 rbp-0x60 -> 결과값 저장 홀수일때는 0xc ^ (인자 값 1개 - 0x4) => 결과값 rbp-0x60 -> 결과값 저장
마지막으로, encoding된 문자열이 위에서 스택에 저장했던 값과 같은지 비교한다. 비교 문자열은 다음과 같다.
"4919197161836291817161"
이제, encoding된 문자열을 풀기만 하면 된다.
풀이
xor 연산은 교환법칙이 성립하므로, 다음과 같은 코드를 작성할 수 있다.
encrypted = "4919197161836291817161" result = "" for i, t in enumerate(encrypted): if i % 2 == 0: result += chr((ord(t) ^ 0xc) - 0x4) else: result += chr((ord(t) ^ 0xc) + 0x4) print(result)
Get Flag!
'Wargame > HackCTF' 카테고리의 다른 글
[Reversing] BabyMIPS (0) 2019.12.29 [Cryptography] Smooth CipherText (0) 2019.12.23 [Reversing] Keygen (0) 2019.11.24 [Reversing] strncmp (0) 2019.11.21 [Reversing] Handray (0) 2019.11.21