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를 설정하면서 그 흐름 자체를 이해할 수 있는지에 대해 물어보는 것 같다. 단순히 문을 열기 위해 비교하는 구문은 단 한줄에서 끝나기 때문이다.
댓글 없음:
댓글 쓰기