티스토리 뷰

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 valuer3에 저장되고, r9로 복사해온 후 이 값을 5와 비교하는데 5이하라면 “try again :|”이 출력되고 프로그램이 종료된다.


그 후에 strlen이 한 번 더 불리는데 이번에는 0x10보다 크면 “try again :|”을 출력하며 프로그램이 종료된다.

입력 값의 길이 범위는 6~16 이라는 것을 알 수 있다.


그 아래의 루틴을 보면 입력 값의 길이와 입력 값 등을 인자로 다른 함수(sub_10000820)를 호출한다.

이 중 두 번째 인자인 r4레지스터의 값을 보면 r9레지스터를 넣고 있고, r9 레지스터는 r31+0x78이다.


sub_10000820함수는 길어 보여서 자세히 분석하지 않았다.

해당 함수가 호출된 후 그 영역을 확인해보면 base64값이 쓰여져 있는데 디코딩 해보면 입력 값인 “asdf1234”가 나온다.


cmpld구문에서 r30r9의 값을 비교하는데, r30은 처음에 0이고 r9base64 인코딩 된 값의 길이를 나타낸다.

r30 iterator로 사용하여 반복문을 돌고 있다. (r30 < r9 일 때 오른쪽 분기로 가서 반복)


일단 반복문을 벗어나서 아래 루틴을 봤더니 여기도 반복문이다.


첫 번째 반복문이 끝났을 때, base64 값을 확인해보니 이렇게 변해있다.

cmpld구문에서 r301, r9는 위 값의 길이이다. (r30 < r9 일 때 왼쪽 분기로 가서 반복


왼쪽 분기로 가면 r10과 r9를 비교하는데 여기가 중요해 보인다.

0x4000851d88 + iterator 에 있는 값 1바이트와 bss 영역의 1바이트를 비교한다.


이때 bss 영역에 쓰여진 값은 위와 같은 24바이트 값이다.

이 값을 맞춰주면 될 것 같다.

결국 중요한 건 첫 번째 반복문에서 어떤 과정을 거쳐서 base64 값을 변환하는지 이다.


다시 첫 번째 반복문을 살펴봤다.

sub_10000468rand함수를 부르므로 r3에 랜덤값이 생성되어 저장된다.

이 값에 몇 가지 연산을 거치고 extswr10에 저장한다.

그 후 base64 값의 한 글자(첫 글자부터 차례로)를 가져와 r8에 저장하고, r10r8xor하여 값을 변조한다.

이때, 랜덤 값의 생성 결과는 실행 할 때마다 같은 값이다.

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}

..^^


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함