scanf/fscanf/vscanf 在调shellcode的时候的问题

今天在调shellcode的时候遇到了一个小问题,shellcode的逻辑功能没有任何问题,但是用的时候无法执行。在OD里面调的时候发现,shellcode的后半段变成了cccc…

于是分析了下代码,发现是shellcode中有个bit是0b,然后在读取完之后变成了00cccc

char password[1024];

FILE * fp;

if(!(fp=fopen(“password.txt”,”rw+”)))

{

printf(“test\n”);

exit(0);

}

fscanf(fp,”%s”,password);

后面password会导致溢出

shellcode从password.txt中传入,最后发现是fscanf的问题导致的

上网看了下fscanf的源码发现和scanf一样都是调用vscanf,然后当以“%s”读取字符串的时候会把某些字符解析成了有含义的符号:

Hex Dec Ctrl Name
0x09  9  ^I  Tab
0x0A 10  ^J  Line Feed
0x0B 11  ^K  Verticle Feed
0x0C 12  ^L  Form Feed
0x0D 13  ^M  Carriage Return
0x1A 26  ^Z  End of File
0x20 32      Space

神奇的发现读取“00”的时候并没有问题,然后出了%s,其他几个格式化字符:

  • %d — works fine
  • %f — works fine
  • %s — ignores preceeding whitespace and reads one ‘word’
  • %c — rarely works as expected

如果自己在写代码的时候,尽量不要用“%s”,而是用”%c”,但是scanf/fscanf/vscanf 一般不会用在生产代码里面。

 

那么在写shellcode的时候,如果遇到shellcode会经过scanf/fscanf/vscanf 函数处理,那么要检查下shellcode中是否有上面表格中列出来的字符。

 

reference:

http://www.gidnetwork.com/b-64.html

更早的文章

windows下获取dll中函数地址的方法

在windows下面调试shellcode的时候需要查找一些函数的地址,这里总结下可以用的方法:1、微软的depents工具:http://www.dependencywalker.com/这个在xp上应该没问题但是在64位win7之后的系统会报错,github上有人写了新的工具解决了这个问题(https://github.com/lucasg/Dependencies)但是我这个软件读出来的地址不是正确的函数地址,具体原因未知,待测试 2、在调试的时候直接在OD中查找函数地址使用ctrl...…

dll function shellcode windows 函数地址继续阅读