是的,已经存在相当多的类似问题(5037601,19166698,4855162,14505995,5052648,13409508,7745146,7459630;对不起,没有足够的代表超过2个链接),是的,有一些很好的文章解释这种东西(点击,点击,http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html).我已经阅读了它们,我认为我得到了一般的想法,但我仍然失败,成功地利用了我能想到的最简单的训练玩具示例.
#include <stdio.h>
void f(char* a)
{
printf("a: %p\n", &a);
printf(a);
return;
}
void main(int argc, char** argv)
{
f(argv[1]); //please ignore the lack of any check
return;
}
Run Code Online (Sandbox Code Playgroud)
是的,堆栈是可执行的,是的,内存布局随机化被禁用.每次执行都给我相同的地址a.我可以提供它,例如$ ruby -e 'print "AAAA"+("%08x."*16)',这导致:
a: 0xbfffece0
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838.
Run Code Online (Sandbox Code Playgroud)
所以现在我可以看到我的输入最终在内存中.我可以用栈写一个值$ ruby -e 'print "12345%n"+("%08x."*16)',结果如下:
a: 0xbfffece0
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78.
Run Code Online (Sandbox Code Playgroud)
显然,我的最终目标可能是这样的<something><NOPs><shellcode>,其中<something>覆盖了返回地址,f以便程序将跳转到NOP底座并执行shellcode.但保存的返回地址的地址现在似乎取决于我的输入,对吧?类似的东西0xbfffece0 - len(input) - 12,假设一个12字节的序幕?也许这个例子毕竟不是最简单的......
我很困惑.有任何想法吗?
我正在使用带有 Cortex M4 的 STM32F407,并且通过在DWT_CYCCNT调用我在汇编中实现的函数(C 语言)之前和之后直接读取来测量函数的周期计数。我想了解我得到的结果。
08000610 <my_function>:
8000610: f04f 20ff mov.w r0, #4278255360 ; 0xff00ff00
8000614: f04f 11ff mov.w r1, #16711935 ; 0xff00ff
8000618: ea81 0100 eor.w r1, r1, r0
800061c: ea81 0100 eor.w r1, r1, r0
8000620: ea81 0100 eor.w r1, r1, r0
8000624: ea81 0100 eor.w r1, r1, r0
8000628: 4770 bx lr
800062a: bf00 nop
Run Code Online (Sandbox Code Playgroud)
执行上述(包括函数调用)需要21个周期。当我添加一条eor指令时:
08000610 <my_function>:
8000610: f04f 20ff mov.w r0, #4278255360 ; 0xff00ff00
8000614: f04f 11ff mov.w r1, #16711935 …Run Code Online (Sandbox Code Playgroud)