我想知道是否可以在不声明数据段中的格式数组的情况下调用printf。这个问题与x86有关。
#include <stdio.h>
int main()
{
__asm
{
push 1 ; number to print
push 3710092110 ; format in ascii for %d\n
call printf
add esp, 8
}
return 0;
}
好的,所以我们需要推送格式的地址而不是格式本身,所以这样的东西应该足够接近吗?
#include <stdio.h>
int main()
{
__asm
{
push 3710092110 ; 3710092110 = format in ascii for %d\n
push 1; argument to print
lea edx, dword ptr[esp + 4]; get address of the format on stack
push edx ; push the address of the format
call printf
add esp, 12
}
return 0;
}
你们碰巧有时间展示一个有效的例子吗?在互联网上找不到任何关于它的东西。
答案 0 :(得分:3)
通过在堆栈上按地址来传递格式字符串。所以你可以将字符串放在任何你喜欢的地方,但仍然需要传递它的地址。
答案 1 :(得分:3)
您的第二个代码段已接近但仍需要为格式字符串%d \ n 的内容使用不同的值。
所涉及的字符转换为% = 37, d = 100, \ n = 10十进制。
但使用十六进制更容易:% = 25h, d = 64h, \ n = 0Ah
由于很少的努力,我们必须将第一个字符放在dword的最低字节中以推动堆栈。我们将最高字节为零,以便进行必要的空终止。
print 123 == '123' # false
print 123 is '123' # false
print str(123) == '123' # true
print '123' == '123' # true
print '123' is '123' # false
您的代码:
%d\n --> 000A6425h