2016-12-03 1 views
-1

여기 코드가하는 일을 이해하고이를 해결하는 방법을 설명합니다. 먼저 문자열을 찾아서 16 진수 문자열을 기반으로 문자열을 리버스 엔지니어링해야합니다. 내가 찾은 바이트 룩업 테이블. 나는이 "오프셋"의 값이 최대 60 개가되어야 함을 알고 있습니다 (< +53> 라인 참조).2 진 폭탄 디코딩 : phase_5

x/s 0x4011fe를 사용하여이 6 자 문자열을 찾으려고 시도했으며 다른 명령 (x/6c 등)을 검사했지만 정확한 값을 얻지 못했습니다. 이 단계를 계속 진행할 수 있도록 올바른 출력을 얻기 위해 변경할 수있는 것이 있습니까?

일단이 문자열을 발견하면, 필자의 생각은이 필요한 출력 문자열을보고 예상되는 출력에 도달하는 데 필요한 입력 문자열을 파악하는 것입니다. 나는 생각하고있다 - 각 char의 16 진수 값을보고, 그것들을 내 테이블 (가장 낮은 순서)과 비교하고, ascii 테이블을 사용하여 해당 char를 찾는다. 이것이 올바른 접근 방식인지 궁금합니다. 고마워요.

조회 테이블 : phase_5의

(gdb) x/16xw 0x402780 
<array.3600>: 0x00000002 0x0000000a 0x00000006 0x00000001 
<array.3600>: 0x0000000c 0x00000010 0x00000009 0x00000003 
<array.3600>: 0x00000004 0x00000007 0x0000000e 0x00000005 
<array.3600>: 0x0000000b 0x00000008 0x0000000f 0x0000000d 

분해는 :

0x00000000004011bf <+0>: push %rbx 
0x00000000004011c0 <+1>: mov %rdi,%rbx 
0x00000000004011c3 <+4>: callq 0x401414 <string_length> 
0x00000000004011c8 <+9>: cmp $0x6,%eax //6 letter string! 
0x00000000004011cb <+12>: je  0x4011d2 <phase_5+19> //if 6, jump over the explode 
0x00000000004011cd <+14>: callq 0x401706 <explode_bomb> 
0x00000000004011d2 <+19>: mov %rbx,%rax 
0x00000000004011d5 <+22>: lea 0x6(%rbx),%rdi 
0x00000000004011d9 <+26>: mov $0x0,%ecx 
0x00000000004011de <+31>: movzbl (%rax),%edx 
0x00000000004011e1 <+34>: and $0xf,%edx //”and” each letter 
0x00000000004011e4 <+37>: add 0x402780(,%rdx,4),%ecx 
0x00000000004011eb <+44>: add $0x1,%rax 
0x00000000004011ef <+48>: cmp %rdi,%rax //compare, and then loop again. 
0x00000000004011f2 <+51>: jne 0x4011de <phase_5+31> //loop! 
0x00000000004011f4 <+53>: cmp $0x3c,%ecx //final compare, and then done! (0x3c = 60) 
0x00000000004011f7 <+56>: je  0x4011fe <phase_5+63> //jump over explode, and finish! 
0x00000000004011f9 <+58>: callq 0x401706 <explode_bomb> 
0x00000000004011fe <+63>: pop %rbx 
0x00000000004011ff <+64>: retq 
End of assembler dump. 
+2

저는 적어도 몇 가지 피드백을주지 않고 사람들 투표를 좋아하지 않았습니다. 나는 투표를하지 않았지만, 다른 사람들이 당신에게 설명의 호의를 베풀지 않았기 때문에 숙제에 관한 질문을 올렸으며 기본적으로 "나는 무엇을 해야할지 모르겠다. 대답은 무엇인가?"라고 말했다. 당신은 당신의 목표가 무엇인지 게시하고 올바른 방향으로 찔러보기를 요구한다면 훨씬 더 운이 좋을 것입니다. 비록 stackoverflow.com이 그렇게 생각하지는 않습니다. –

+0

그 외에도 사람들이 숙제를 게시하고 긍정적 인 반응을 얻는 것을 보았을 때 일반적으로 저자는 시도한 것을 설명하여 사람들이 저자의 숙제를하고있는 것처럼 느끼지 않습니다. –

+0

@BrianVandenberg에 대해 유감스럽게 생각합니다. 정말 감사드립니다. 나는 나의 질문을 편집했다, 잘하면 지금은 더 좋다. 나는 주로 며칠 동안 지켜본 문자열을 찾는 방법에 주저합니다. 나는 내가 올바르게 생각하고 있다는 확인을 얻기 위해 내 사고 과정을 설명하려고 노력했다. 나는 그것을 더 분명하게하려고 노력할 것이다. 다시 한 번 감사드립니다! – Mary

답변

1

은 많은 생각 후에, 나는 성공적으로 대답을 발견했다. 비교할 문자열이 없으며 0x3c 값만 있습니다. 어셈블리 코드를 읽을 때 오히려 저의 생각이 저의 공통점으로 보입니다.

기본적으로 배열에서 0x3c까지 합쳐진 6 개의 숫자를 선택해야했습니다. 그런 다음 적절한 4 비트 인덱스로 적절한 6 개의 인쇄 가능한 문자 또는 숫자를 선택하십시오. 그래서, 가장 쉬운 선택은 1의 색인을 갖는 0xa (0xa = 10이므로 6 개의 값을 얻는 것은 간단합니다)입니다.

의견을 보내 주셔서 감사합니다.