어셈블리 언어 코드 올리 디버그 backstepping 시퀀스 번호를 사용하여 알고리즘

아직도하는 traceMe을 사용하여, 관련 내용을 참조하시기 바랍니다 https://blog.51cto.com/181647568/2421560

어셈블리 코드의 반복 연구하는 traceMe을 통해, 나는 과제의 값을 관찰하여 특정 명령의 역할을 생각한다.

의 image.png

내가 호출 명령의 마지막 줄까지하고있는 명령 코드의 오른쪽에 표시, 호출 명령은 다음 점프의 일부, 다음 그림의 JE는 우리의 대부분의 시작은 명령 NOP 것을 발파 그래서 상관없이 일련 번호가 이미있는 전화 TraceMe.00401340에, 밖으로 얼마나 정확한.

의 image.png

OK 내가 중단 점을 추가 한 다음 촉진하기 위해,이 방법으로 이동할 수있는 전화를 입력합니다 누른 채 클릭 한 다음 나는 F9 키를 통해 신속하게이 단계를 건너 뛸 수 있습니다.

의 image.png

보기 할당 따르면 곧 몇 가지 행동 부분에주기의 끝에 발견했다.

의 image.png

사이클 후, 프로그램은 시퀀스 번호를 취할 동작을 제조하고, 이하의 비교 (lstrcmpA 방법)를 수행 하였다. (블로그 전술의 때문에 https://blog.51cto.com/181647568/2421560 ) 내가 정확하고 잘못된 코드를 입력했다이 자리에 있도록, 정확한 확인 코드를 취할 수 있었다 참조 상황. 결과 프로그램 레지스터합니다 (EAX)의 동작이 완료된 후의 값이 유지함 것을 보여, 시퀀스 번호 1은 정확한 오류 0이다.

그리고이 테스트는 JE 명령을 제어하는 ​​것입니다.

이 그래서 나는 일련 번호가 사이클에서 계산되는 것을 확인할 수 있습니다.

의 image.png

나는 그것이주기 일곱 번의 시작이라고 생각하는 0x7로 볼 수 있습니다, 그리고 내가 반복 반복주기, MOV 부분 바라 보았다, 나는 명확하게 할당의 푸른 부분을 볼 수 있습니다

의 image.png

그림은, 내가 일관성을 확인하기 위해,이 문자는 내가 입력 한 네 번째 이름입니다 인식 할 수 내가 생각하는 첫 번째 사이클의 결과이다, 나는 넷째, 때마다 사용자 이름을 여러 번 수정 비트. 그리고 아스키 코드 형태에 대응, 실제로 ASCII 코드를하지만, 진수에 맞춰 디지털로 변환됩니다.

그리고 MOV 핑크 16 진수 C의 부분은, 나는 그것이 무엇을 의미하는지 파악하지 않았다.

然后接下来的操作包含了imul,add,inc三个操作符,我特意百度了一下imul是乘法相当于edx=edx*ebx,数值是前面的用户名第四位的ASCII码和C的积。同理add就是esi=esi+edx,这个esi只在这句话里出现,而edx正好是前面乘法的结果,所以每次循环的积都会被累加到esi中。

inc ecx则是指ecx=ecx+1这个很像是计数器,所以ecx,eax都是计数器,它们都对应着一个cmp。

最后的那个cmp用ecx和edi,根据我的调试,edi永远是用户名的长度,而且这个判断是控制循环的,这个循环从4开始循环到用户名长度的那个数。

在每次循环中我反复的观察两个MOV命令,蓝色部分比较明显,永远是用户名的第N位的ASCII码,从4开始。粉红色部分就比较奇怪了,第一个是C,第二次是A第三次是13,都是16位的数字,毫无规律可循。于是我只能去理解[eax+0x405030]是什么意思了,首先eax一定指的是寄存器eax,eax的值会由一句inc eax每次都加1,而在循环第一句会判断这个eax是否会大于7,如果大于7会执行xor eax,eax,这个操作会把eax清零。(而在一开始我把这个7给理解错了,我以为这个控制循环次数的,循环从4开始,到用户名长度结束,如果用户名长度很长的话,也只会运行七次。但是后来我输入了一个较长的用户名,运行七次后并没有退出程序。)

0x405030明显是一个内存地址,我右键“数据窗口中跟随”然后查到这个内存地址

의 image.png

对应的ASCII码是乱码,我一开始没有理解,不过在几次循环后我发了规律,oc oa 13 09这些数字和粉红色参数的值是对应的,我立即就猜出了第四次循环的蓝色值和粉红色的值。第四次循环的结果确定了,当时还没能理解eax和这个内存地址的关系。我就用了一个比较长的用户名不停的测试,粉红色部分一直到最后的08之后并没有到D0而是回到了0C。于是我就能理解了,这是八个数字开始循环的。于是整个循环的命令差不多就能模拟出了。

네 번째 문자 사용자 이름 C 곱하는 ASCII 코드를 가지고 시작에서 ASCII 코드 다섯 문자가 곱 번에서 두번째 문자 C. 승산했다 마지막 문자까지. 이 제품이 결합되어, 시퀀스 번호는 진수로 변환됩니다.

추천

출처blog.51cto.com/181647568/2423266