首页
社区
课程
招聘
请教下这个msvcp90.std::basic_string是如何比较的,谢了!
发表于: 2014-7-8 10:07 4827

请教下这个msvcp90.std::basic_string是如何比较的,谢了!

2014-7-8 10:07
4827
下面各参数来源都知道,看调用的CALL貌似是字符比较,自己查了很久,但不明白参数之间是如何比较的,通俗的讲,就是那个比较那个,及如何比较的。因为我需要这个函数的返回值。求高手指点一下,谢谢了!
004C81C0  /$  55            push ebp                                 ;  [ebp+4]= ASCII "marsh_good_and_bad_job"
004C81C1  |.  8BEC          mov ebp,esp
004C81C3  |.  51            push ecx                                 ;  ECX=04D7E2A4
004C81C4  |.  894D FC       mov [local.1],ecx
004C81C7  |.  8B45 0C       mov eax,[arg.2]
004C81CA  |.  50            push eax                                 ;  [eax+4]= ASCII "marsh_good_and_bad_job"
004C81CB  |.  8B4D 08       mov ecx,[arg.1]
004C81CE  |.  51            push ecx                                 ;  ECX=1125721C
004C81CF  |.  FF15 84931601 call dword ptr ds:[<&MSVCP90.??$?MDU?$ch>;  msvcp90.??$?MDU?$char_traits@D@std@@V?$allocator@D@1@@std@@YA_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@0@Z
004C81D5  |.  83C4 08       add esp,0x8
004C81D8  |.  8BE5          mov esp,ebp
004C81DA  |.  5D            pop ebp
004C81DB  \.  C2 0800       retn 0x8

//这个是上面调用的CALL内部
78495979 >  8BFF            mov edi,edi
7849597B    55              push ebp
7849597C    8BEC            mov ebp,esp
7849597E    FF75 0C         push dword ptr ss:[ebp+0xC]
78495981    8B4D 08         mov ecx,dword ptr ss:[ebp+0x8]
78495984    E8 8203FFFF     call msvcp90.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare
78495989    33C9            xor ecx,ecx
7849598B    85C0            test eax,eax
7849598D    0F9CC1          setl cl
78495990    8AC1            mov al,cl
78495992    5D              pop ebp
78495993    C3              retn

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 149
活跃值: (2618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
std::string.compare
2014-7-8 10:28
0
雪    币: 862
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
std::string.compare 继续跟进去,找EAX的值就是返回值啦
2014-7-8 13:06
0
雪    币: 2
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
我知道是std::string.compare的,我只是不明白,这个函数是如何进行比较的,比如这个实例要比较的字符是[eax+4]= ASCII "marsh_good_and_bad_job",但是拿这字符和谁比较呢?
2014-7-8 14:09
0
雪    币: 149
活跃值: (2618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=mywmshow;1299144]我知道是std::string.compare的,我只是不明白,这个函数是如何进行比较的,比如这个实例要比较的字符是[eax+4]= ASCII "marsh_good_and_bad_job",但是拿这字符和谁比较呢?[/QUOTE]

string 是一个类 类似于cstring ,compare是和string类存放的文本进行比较的

http://blog.sina.com.cn/s/blog_5c4db7cb0100pne3.html
2014-7-8 14:21
0
雪    币: 2
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
真不好意思,本人不会C,但查阅了相关资料,理论上基本上明白是咋回事,但不理解该函数在汇编中的表现形式,拿本例说明,根据实际情况我知道要比较的字符是:004C81CA   push eax  ;  [eax+4]= ASCII "marsh_good_and_bad_job"
那这个string类存放的文本是以指针形式传入该函数的吗?长度是多少呢?
是这个004C81C3  push ecx  ;  ECX=04D7E2A4
还是004C81CE  push ecx     ;  ECX=1125721C
2014-7-8 14:29
0
雪    币: 149
活跃值: (2618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=mywmshow;1299149]真不好意思,本人不会C,但查阅了相关资料,理论上基本上明白是咋回事,但不理解该函数在汇编中的表现形式,拿本例说明,根据实际情况我知道要比较的字符是:004C81CA   push eax  ;  [eax+4]= ASCII "marsh_good_and_bad_job"...[/QUOTE]

不懂c我就解释不清楚了
2014-7-8 14:33
0
雪    币: 279
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
msvcp90.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare
里面应该有你们要比较的字符串地址和长度
2014-7-9 06:31
0
游客
登录 | 注册 方可回帖
返回
//