티스토리 뷰
simpleArch (Reversing) write-up
simpleArch-v1이라는 바이너리를 다운 받을 수 있고, 이 바이너리는 s390x 라는 아키텍쳐를 사용한다.
힌드로 simpleArch-v2라는 바이너리가 올라왔는데 이 바이너리는 64bit powerpc 바이너리이다.
qemu를 이용해서 simpleArch-v2를 분석했다.
분석에 들어가기 앞서..
qemu와 위의 것들을 설치해주고,
이렇게 실행하면 ubuntu에서 powerpc 바이너리를 실행하고 디버깅할 수 있다!
IDA로 열어보면 사용되는 라이브러리 함수를 몇 개 볼 수 있다.
strlen함수에서 입력 값의 길이를 비교할 것으로 생각되어 브레이크 포인터를 걸어봤다.
strlen함수의 plt에 브레이크가 걸렸고 어떤 함수에서 호출 됐는지 확인해봤다.
R3레지스터에 strlen함수의 인자가 있는데 확인 결과, argv1의 값이다.
powerpc에서 함수의 return value는 r3에 저장되고, r9로 복사해온 후 이 값을 5와 비교하는데 5이하라면 “try again :|”이 출력되고 프로그램이 종료된다.
그 후에 strlen이 한 번 더 불리는데 이번에는 0x10보다 크면 “try again :|”을 출력하며 프로그램이 종료된다.
입력 값의 길이 범위는 6~16 이라는 것을 알 수 있다.
그 아래의 루틴을 보면 입력 값의 길이와 입력 값 등을 인자로 다른 함수(sub_10000820)를 호출한다.
이 중 두 번째 인자인 r4레지스터의 값을 보면 r9레지스터를 넣고 있고, r9 레지스터는 r31+0x78이다.
sub_10000820함수는 길어 보여서 자세히 분석하지 않았다.
해당 함수가 호출된 후 그 영역을 확인해보면 base64값이 쓰여져 있는데 디코딩 해보면 입력 값인 “asdf1234”가 나온다.
cmpld구문에서 r30과 r9의 값을 비교하는데, r30은 처음에 0이고 r9는 base64 인코딩 된 값의 길이를 나타낸다.
r30을 iterator로 사용하여 반복문을 돌고 있다. (r30 < r9 일 때 오른쪽 분기로 가서 반복)
일단 반복문을 벗어나서 아래 루틴을 봤더니 여기도 반복문이다.
첫 번째 반복문이 끝났을 때, base64 값을 확인해보니 이렇게 변해있다.
cmpld구문에서 r30은 1, r9는 위 값의 길이이다. (r30 < r9 일 때 왼쪽 분기로 가서 반복)
왼쪽 분기로 가면 r10과 r9를 비교하는데 여기가 중요해 보인다.
0x4000851d88 + iterator 에 있는 값 1바이트와 bss 영역의 1바이트를 비교한다.
이때 bss 영역에 쓰여진 값은 위와 같은 24바이트 값이다.
이 값을 맞춰주면 될 것 같다.
결국 중요한 건 첫 번째 반복문에서 어떤 과정을 거쳐서 base64 값을 변환하는지 이다.
다시 첫 번째 반복문을 살펴봤다.
sub_10000468은 rand함수를 부르므로 r3에 랜덤값이 생성되어 저장된다.
이 값에 몇 가지 연산을 거치고 extsw로 r10에 저장한다.
그 후 base64 값의 한 글자(첫 글자부터 차례로)를 가져와 r8에 저장하고, r10과 r8을 xor하여 값을 변조한다.
이때, 랜덤 값의 생성 결과는 실행 할 때마다 같은 값이다.
srand함수 사용시 시드값으로 101이라는 고정 값을 사용하기 때문이다.
입력 값 |
Base64 |
변조된 값 |
ABCDEFGHIJKLMNOP |
0x51554a44 0x52455647 0x5230684a 0x536b744d 0x54553550 0x55413d3d |
0x5a72bb4b 0xc4de93ac 0xe6cb12a1 0xd95afcca 0xcf78cff8 0xfc85d02e |
base64 값과 변조된 값을 xor 하면 xor 되는 값이 무엇인지 알아낼 수 있다.
xor 되는 값 |
변조된 값 (답) |
Base64 |
0x0b27f10f 0x969bc5eb 0xb4fb7aeb 0x8a318887 0x9b2dfaa8 0xa9c4ed13 |
0x5e62c856 0xf3aba9be 0xecc91691 0xd202c5fd 0xd479b89c 0xcf95d02e |
0x55453959 0x65306c55 0x58326c7a 0x58334d7a 0x4f544234 0x66513d3d |
알아낸 값을 문자열로 나타내면 “UE9Ye0lUX2lzX3MzOTB4fQ==”이 된다.
이 값을 디코딩하면 POX{IT_is_s390x}
..^ㅠ^
'해킹 > CTF' 카테고리의 다른 글
[DEF CON CTF Qual 2017] beatmeonthedl write-up (0) | 2017.05.04 |
---|---|
[2017 Plaid CTF] Echo (200pts) write-up (0) | 2017.04.24 |
[2016 POX CTF final] sombra1 (100) write-up (0) | 2016.11.12 |
[2016 POX CTF final] sombra2 (300) wirte-up (0) | 2016.11.12 |
[2016 POX CTF final] keygen (100) write-up (0) | 2016.11.12 |