어제 길다고 넘어간 sub_20C를 결국 분석해야겠다는 결론에 이르렀다. 

그리고 문자열을 입력하다가 (3)에서 적은내용이 잘못되었다는 것을 알았는데
r29:r28 이 가리키는 곳에 문자열은 (어떤문자, 입력한 문자열) 로 내가 입력한 문자가 아니었다.



위의 그래프를 보면 노란색으로 칠한 부분에서 함수호출이 각각 9번,10번이 발생하고 있다.
저 함수에서 생성된 값이 10바이트 10바이트 인 것과 연관이 있어보인다.

sub_20C를 호출 후 변화가 생기는 데이터는
(r29+0x1):(r28+0x1) 과 (r29+0x1):(r28+0xA) 인데


입력 문자열 : 4321dcbb

sub_20C 진입전 (r29+0x1):(r28+0x1) = 9A 7D 72 57 D5 78 49 E6 F2 02
sub_20C 진입전 (r29+0x1):(r28+0xA) = A6 93 C4 DD 1D 71 DE C4 A0 02

sub_20C진입후 (r28+0x1)):(r28+0x1) = 9A 7D 72 57 D5 78 49 E6 F2 02 (변동없음)
sub_20C 진입후 (r29+0x1):(r28+0xA) = A7 27 89 BB 3A E2 B7 89 A3 02 (전부변함)  


입력 문자열 : reverse1

sub_20C 진입전 (r29+0x1):(r28+0x1) = 9A 7D 72 57 D5 78 49 E6 F2 02
sub_20C 진입전 (r29+0x1):(r28+0xA) = A6 93 C4 DD 1D 71 DE C4 A0 02  


sub_20C 진입후 (r29+0x1):(r28+0x1) = 9A 7D 72 57 D5 78 49 E6 F2 02 (변동없음)
sub_20C 진입후 (r29+0x1):(r28+0xA) = DF ED 6C 99 46 CE A7 87 F0 03 (전부변함)  



(r29+0x1):(r28+0x1) 은 문자열에 관계없이 변화가 없고
(r29+0x1):(r28+0xA) 은 문자열에 따라 변화가 다름을 확인할 수 있었다.

하지만 연산내부를 살펴보니 역연산으로 복원이 불가능한 연산들이 몇 가지 있어서

동일한 10byte로 덮어씌운뒤 쉘에 진입하니 readme 의 내용이 변하였다. 하지만 이전에 있던 내용이 바뀐게 아니라 가리키는 장소가 변한 것으로 보인다.

그럼 여기서 영향을 주는게 저 10byte 인지 아니면 입력한 문자열 그 자체인지를 확인하였다.

입력 문자열 : bungbung 이고 10byte 를 9A 7D 72 57 D5 78 49 E6 F2 02 로 맞췄을 때


입력 문자열 : bungbung 이고 10byte 를 수정하지 않았을 때


다르다! 올ㅋ 혹시나 하는 마음에 다시해보았다.

... 똑같다..

그렇다면 어쨌든 readme 의 데이터는 고정된 위치를 가리키는게 아니라 문자열에 따라 어딘가를 가리키는 것이 아닌가 라는 생각이 들었다.
10byte는 사실상 중요하지않고 입력하는 8개 문자가 중요한것으로 보인다.

어쨌든 cat 명령을 수행 할 때 어떻게 동작되는지 확인하려고 하는데 우연히 data memory 에서 오른쪽 버튼으로 클릭하니 아래와 같은게 보였다.

그렇다. 메모리영역에 접근할 때 브레이크포인트를 거는것이 가능했다!
이걸 왜 어제는 못 봤는지 모르겠지만 있어서 다행이다. 이로써 한결 분석하기 편해졌다.

cat을 입력할 때 점프하는 곳은 0x1B5 였다. 


좀 더 진행하니 sub_661 로 진입한다는 것을 알았다.


ㅎ... 또 멋지고 아름다운 그래프 오버뷰가 나를 맞이해줬다.

sub_20c 를 역연산 하는게 맞을지도 모르겠다..

sub_661 함수 에서 0x6b5 를 대상으로 뭔가를 열심히 읽고있다. 보니 입력한 패스워드문자열이 복사된 곳이다.


여기서 문자를 출력하고 있는데 이것으로는 readme의 내용을 알 수 없을거 같다.
따라서 sub_20c를 다시 분석해야 할꺼 같다.

'reversing.kr' 카테고리의 다른 글

AVR reverse engineering (5) CustomShell  (0) 2018.08.06
reversing.kr CRC1  (0) 2018.02.07
AVR reverse engineering (3) CustomShell  (0) 2018.02.05
AVR reverse engineering (2) AVR ATmega128  (0) 2018.01.30
AVR reverse engineering(1) - 환경구축  (0) 2018.01.29
환경구축과 타겟 머신(ATmega128/L) 에 대략적인 정보를 확인하였으니 본격적으로 문제를 접근해보고자 한다.

먼저 IDA 를 이용해 문자열이 뭐가 있는지 확인해보았다.

이름답게 passwd, shadow 등의 명령어와 readme가 있다.

일단 readme를 읽으면 끝나는게 아닐까? 라는 의심을 가지고 문제에 접근하기로했다.

하지만 우선은 Login 과 Password 에서 입력하는 값을 맞추지 않으면 넘어가지 못할것이다.

어디서 입력값을 뱉는가 Atmel Studio와 IDA를 이용해 찾아보니


sub_729를 호출했을 때 login, password 에 대한 입력값을 받고 r24 레지스터에 리턴값을 저장했다.
설마해서 r24를 1로 넣었더니


오우야 안찾아도 쉘로 들어갈 수 있다!

다행히도 명령어에는


ls와 cat을 지원해준다 사용해본결과 ls -al 도 가능하다

readme 는 tmp 에 있었고, 대망의 cat readme를 입력해보았다.

왓 더.. 안된다 절대 저 사진처럼 문자가 두개씩 들어갔기때문은 아니다!
에러 메시지를 보면 알겠지만 (입력한 문자열) : No such file or directory 로 출력되기때문에 문자열은 제대로 들어갔다고 판단했다.

혹시나 하는 마음에 IDA에서 readme 문자열을 클릭해보았다.


... 띄어쓰기가 있었다 readme(공백문자) 였던 것이다!
공백문자를 쓰고 입력해도 아마 파싱하는 과정에서 공백문자가 제거되기 때문인지 찾을수 없다고 나오기 때문에 직접 저 부분을 00 으로 수정한 뒤 다시 해보았다.

위와 같이 개박살난 문자열이 나온다. 해당 메모리  분석이 필요하다.

IDA로 조회 해봤을 때 zZbN????28?qG 로 처음부터 이 값이 들어가 있음을 알 수 있다.
7A 5A 62 4E 0F 1F 12 03  32 38 1D 71 47 13바이트인데 해시값은 아닌거 같다. 

메모리 브레이크 포인트를 걸고 싶은데 어떻게 거는지 모르겠다.

혹시나 해서 위의 13바이트를 토대로 0~255 xor 연산을 수행했으나 문자열처럼 보이는게 없다.

Login : 에서 받은 문자열과 Password : 에서 받은 문자열을 체크하는 루틴에서 Login에서 일치하지 않은 경우 r24에 0을 넣고 리턴한다.
이 때 거치지 않은 루틴에 Password : 에서 받은 문자열을 가지고 장난질을 하는 sub_205 라는 함수가 있는데 내부를 보면

오우야.. 길고 아름답다.

여기서 하나 가정을 세웠다. 비밀번호도 아이디도 틀린상태에서 r24를 바꿨을 때 readme 값이 변하지 않은거라면,
아이디를 맞춘상태에서 r24를 변경하고 진행했을 때 readme의 내용이 영향이 있을까? 라는 것이었다. 그리고 이 영향을 주는 함수가 sub_20C라고 가정하고 확인해보았다.

sub_20C 수행 전

sub_20C  수행 후


...변화가 없다.

sub_8F5를 수행하고 나서는 변화가 있을지 확인해보았다.

...변화가 없다. ㅠㅠ

로그인 검증루틴 끝날때 까지 없다.

'reversing.kr' 카테고리의 다른 글

AVR reverse engineering (5) CustomShell  (0) 2018.08.06
reversing.kr CRC1  (0) 2018.02.07
AVR reverse engineering (4) CustomShell  (0) 2018.02.05
AVR reverse engineering (2) AVR ATmega128  (0) 2018.01.30
AVR reverse engineering(1) - 환경구축  (0) 2018.01.29
구글에서 검색하다 나온 자료인
Practical Firmware Reversing and Exploit Developmetn for AVR-based Embedded Devices
에서 나온 ATmega128에 대한 정보를 정리하였다.

AVR = Alf and Vegard's RISC processor 

(1) 구조
Modifed Harvard architecture 8-bit RISC single-chip microcontroller 
Haravrd architecture ?
간단히 말하자면 명령어 버스와 데이터 버스를 물리적으로 분할한 컴퓨터 구조

(2) 용도
Industrial PLCs and gateways
IoT
HID devices
Automotive applications
Radio applications
Arduino platform
...

(3)Core


보면 code 와 data가 분리되어있음을 확인 할 수 있다.

(4) Memory Map
-A 유형
0000 ~ FFFF 번지 까지 있음
0000 ~ 001F 는 레지스터 (32)
0020 ~ 005F 는 I/O 레지스터(64)
0060 ~ 00FF 는 External I/O 레지스터(160)
0100 ~ 10FF 는 Internal SRAM
1100 ~         는 External SRAM 
-B 유형
0000 ~ FFFF 번지 까지 있음
0000 ~ 001F 는 레지스터 (32)
0020 ~ 005F 는 I/O 레지스터(64)
0060 ~ 0FFF 는 Internal SRAM
1000 ~         는 External SRAM

(5) Registers
R1~R25 - GPR
X,Y,Z      - pair "working" registers e.g memory addressing operations <- 메모리맵에 26~32번에 해당
I/O registers - 다른 하드웨어에 접근하기 위한 용도

(6) special registers
PC - program counter , 16 bit register
SP - stack pointer, 16 bit register
SREG - status register 8 bit register

(7) Memory addressing
SRAM/EEPROM - 16-bit addressing, 8-bit element 단위는 8bit지만 16bit 간격으로 하나의 번지임
Flash - 16(8)-bit addressing, 16-bit element

'reversing.kr' 카테고리의 다른 글

AVR reverse engineering (5) CustomShell  (0) 2018.08.06
reversing.kr CRC1  (0) 2018.02.07
AVR reverse engineering (4) CustomShell  (0) 2018.02.05
AVR reverse engineering (3) CustomShell  (0) 2018.02.05
AVR reverse engineering(1) - 환경구축  (0) 2018.01.29

+ Recent posts