pwnable.kr第二遍---passcode

>>>>>passcode
1.题目中有两个scanf("%d",addr)的不标准格式
按照scanf()的使用,应该是将stdin的整型数赋值给地址addr处


而接下来的passcode1==338150&&passcode2=13371337两个判断条件
其中passcode1和passcode2是整型


int addr;
假如输入100
则*addr=100
那么addr?


而且如何修改addr值?


2.lea mov
lea(load effective address)
lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax。
而mov指令则恰恰相反,例如:
mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。


在本题中;如果是使用正确的scanf
则应该为:lea -0x70(%ebp),%edx
把ebp-0x70的值放在edx
否则为:mov -0x10(%ebp),%edx
把(ebp-0x10)地址存放的内容放在edx


于是详解scanf():
mov $0x80487dd,%eax //eax里边存放的是用户输入
lea -0x70(%ebp),%edx //edx存放的是一个地址
mov %edx,0x4(%esp) //将一个地址写入给esp+4指向的的位置
mov %eax,(%esp) //将eax中的内容写入esp指向的的位置
首先将$0x80487dd地址处的内容给eax
将-0x70(%ebp)这一地址给edx
然后将edx的内容给esp+4
再将eax的内容给esp


所以scanf("%d",&a)与scanf("%d",a)在第二句中不一样


3.objdump -R passcode
显示文件的动态重定向入口;也就显示了那些动态链接时才加载的函数信息
如printf scanf fflush等
objdump


4.GS保护
检测某些覆盖函数返回地址、异常处理程序地址或特定类型的参数的缓冲区溢出。


5.GOT表&&如何看GOT区域
IDA




6.内存区域可写的部分??????
代码段(.text):存放
数据段(.data)
BSS段


7.mov %eax (%esp)
esp带括号与否?
eax...通用寄存器与Esp ebp之间的区别
ext段在内存中被映射为只读,但.data和.bss是可写的。
堆栈中哪些是可写的?

8.python -c 


9.如何输入??????


10.system()函数的开始是从0x080485e3开始的而不是ea!!


11.fflush和printf都可以;但是scanf()函数的GOT表不可以


思路详解:
main
esp字节对齐?
esp-10;然后将返回地址压栈
调用函数;指令后边是函数入口地址
将。。。给esp??两个之间相差了40


welcome()
push ebp 新的ebp
0x88的距离处,设置栈顶esp
esp            0xffc25a00 0xffc25a00
ebp            0xffc25a88 0xffc25a88
GS保护
eax(函数返回地址入栈) ebp-0xc
清空eax


将要输出的内容地址给esp,借用eax?
然后调用printf函数


将要输出的内容给esp,借用eax...这里不是这个作用了。。。
将要输入的内容给esp+4的位置,借用edx;ebp-0x70
将要输出的内容地址??给esp,借用eax


将之前的ebp-0xc的直至给eax
最后几句不明白??

login()
esp            0xffc25a60 0xffc25a60
ebp            0xffc25a88 0xffc25a88

push ebp 当前esp作为新的ebp
0x28处 设置栈顶Esp


将要输出的内容借用eax给esp,然后调用printf函数


scanf一般都有四条指令,用到esp,ebp,eax,edx
两条用来存储输入的字符串,两条用来定位目的地址
这里将内容输入到ebp-0x10位置处
输入的内容由Eax交给(%esp)

接下来是两条调用??作用 fflush前边的

然后输出字符串,借用eax
接下来又是scanf指令四条
这次将内容存储到ebp-0xc的位置处

接下来是比较指令,如果不想等则跳转
否则调用位于0x8048460的system()函数

由于第一个字符串的scanf()函数中确定只能接收100长度的字符串
因此只能利用第一个初始化passcode1
然后利用第二个scanf函数将passcode1的内容修改即可

这里的思路是
我们在输入passcode1之后,调用system函数之前一拥有fflush printf scanf函数可以利用
这里如果选用fflush函数的话
修改他的GOT表为system函数的入口地址
这样一来当调用fflush函数时,就调用了system()地址

于是目标转换为,改写GOT-fflush地址内容
那么需要找到存放fflush地址的地方?

可以看到当调用fflush()时会跳转到0x804a004存放的地址
jmp    *0x804a004
那么我们可以令:(*0x804a004)=addr(system())

下边的目标就是寻找system()地址0x8048460

于是就可以搞了。。。



12.汇编学习
mov ax,[bx]是指将ds:bx处的数据放入ax 
mov ax,bx是指将bx中的数放入ax

AT&T: -4(%ebp)                         //相当于 Intel: [ebp - 4]
AT&T: foo(,%eax,4)                     //相当于 Intel: [foo + eax*4]
AT&T: foo(,1)                          //相当于 Intel:[foo]
AT&T: %gs:foo                          //相当于 Intel:gs:foo
AT&T: movl -4(%ebp), %eax              //相当于 Intel: mov eax, [ebp - 4]
AT&T: movl array(, %eax, 4), %eax      //相当于 Intel: mov eax, [eax*4 + array]
AT&T: movw array(%ebx, %eax, 4), %cx   //相当于 Intel: mov cx, [ebx + 4*eax + array]
AT&T: movb $4, %fs:(%eax)              //相当于 Intel: mov fs:eax, 4

你可能感兴趣的:(ctf)