Microcorruption Reykjavik

5

Microcorruption의 Reykjavik이다.

4438 <main>
4438:  3e40 2045      mov #0x4520, r14
443c:  0f4e           mov r14, r15
443e:  3e40 f800      mov #0xf8, r14
4442:  3f40 0024      mov #0x2400, r15
4446:  b012 8644      call #0x4486 <enc>
444a:  b012 0024      call #0x2400
444e:  0f43           clr r15

시작은 break main이다.

막 이것저것 어디서 줏어들은게 많다보니 그냥 대충 느낌은 0x2400를 r15에 넣고 enc를 한 다음에 call 0x2400을 하는 것을 보니 뭔가 encryption을 한 다음에 호출하는구나를 알 수 있다. 실제로 call #0x2400에 break를 걸고 실행해보면 password를 입력 받는 창이 뜬다. 쉘코드다. encryption이 다 끝난 버퍼를 긁어서 사이트에 있는 disassemble했다.

0b12 0412 0441 2452 3150 e0ff 3b40 2045 073c 1b53 8f11 0f12 0312 b012 6424 2152 6f4b 4f93 f623 3012 0a00 0312 b012 6424 2152 3012 1f00 3f40 dcff 0f54 0f12 2312 b012 6424 3150 0600 b490 c7ff dcff 0520 3012 7f00 b012 6424 2153 3150 2000 3441 3b41 3041 1e41 0200 0212 0f4e 8f10 024f 32d0 0080 b012 1000 3241 3041 d21a 189a 22dc 45b9 4279 2d55 858e a4a2 67d7 14ae a119 76f6 42cb 1c04 0efa a61b 74a7 416b d237 a253 22e4 66af c1a5 938b 8971 9b88 fa9b 6674 4e21 2a6b b143 9151 3dcc a6f5 daa7 db3f 8d3c 4d18 4736 dfa6 459a 2461 921d 3291 14e6 8157 b0fe 2ddd 400b 8688 6310 3ab3 612b 0bd9 483f 4e04 5870 4c38 c93c ff36 0e01 7f3e fa55 aeef 051c 242c 3c56 13af e57b 8abf 3040 c537 656e 8278 9af9 9d02 be83 b38c e181 3ad8 395a fce3 4f03 8ec9 9395 4a15 ce3b fd1e 7779 c9c3 5ff2 3dc7 5953 8826 d0b5 d9f8 639e e970 01cd 2119 ca6a d12c 97e2 7538 96c5 8f28 d682 1be5 ab20 7389 48aa 1fa3 472f a564 de2d b710 9081 5205 8d44 cff4 bc2e 577a d5f4 a851 c243 277d a4ca 1e6b 0000 0000

어디서부터 잘라야 할지 몰라서 일단 다 긁었다. 사이즈는 0xf8이니깐 그냥 내 생각엔 0x24f8까지가 의미있는 쉘코드 같았지만 그건 분석해봐야 알 것 같다.

0b12           push r11
0412           push r4
0441           mov sp, r4
2452           add #0x4, r4
3150 e0ff      add #0xffe0, sp
3b40 2045      mov #0x4520, r11
073c           jmp $+0x10
1b53           inc r11
8f11           sxt r15
0f12           push r15
0312           push #0x0
b012 6424      call #0x2464
2152           add #0x4, sp
6f4b           mov.b @r11, r15
4f93           tst.b r15
f623           jnz $-0x12
3012 0a00      push #0xa
0312           push #0x0
b012 6424      call #0x2464
2152           add #0x4, sp
3012 1f00      push #0x1f
3f40 dcff      mov #0xffdc, r15
0f54           add r4, r15
0f12           push r15
2312           push #0x2
b012 6424      call #0x2464
3150 0600      add #0x6, sp
b490 c7ff dcff cmp #0xffc7, -0x24(r4)
0520           jnz $+0xc    
3012 7f00      push #0x7f
b012 6424      call #0x2464
2153           incd sp
3150 2000      add #0x20, sp
3441           pop r4
3b41           pop r11
3041           ret

1e41 0200      mov 0x2(sp), r14
0212           push sr
0f4e           mov r14, r15
8f10           swpb r15
024f           mov r15, sr
32d0 0080      bis #0x8000, sr
b012 1000      call #0x10
3241           pop sr
3041           ret

핵심은,

cmp #0xffc7, -0x24(r4)

이 명령어인데, r4에서 -0x24 위치는 입력 버퍼의 위치고 입력한 값이 0xc7ff 랑 비교해서 맞는지 비교해서 문을 열어준다. 이 문제는 쉘코드라는 그 느낌을 인지할 수 있는지, 메모리에 hardware-bp를 설정하면서 그 흐름 자체를 이해할 수 있는지에 대해 물어보는 것 같다. 단순히 문을 열기 위해 비교하는 구문은 단 한줄에서 끝나기 때문이다.

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

11 Microcurruption의 Addis Ababa다. 4482: 3f40 0a00 mov #0xa, r15 4486: b012 5045 call #0x4550 <putchar> 448a: 8193 0...