Foundations For Hacking Linuxbased on X86/Linux0512-68839303E-mailmengning@ustc.edu.cnhttp://staff.ustc.edu.cn/~mengning18850420135
AgendaCC
CC
espstack pointerebpbase pointerpush 432pop 4ebpCespebpesp
cs : eip/cs : eipcallcs : eipcs : eipretcs : eipcs : eip
// call target// pushl %ebp movl %esp, %ebp
// movl %ebp,%esp popl %ebp ret// //do sth.call1eipA2eipAeip
call xxxcallcallcs : eip call cs : eip xxxxxx pushl %ebp movl %esp, %ebpxxxmovl %ebp,%esppopl %ebpretespebpcs : eipespebpespebpesp
test.c
C mainp1p2
gcc g test.ctestobjdump Stest
p2testp2int p2(int x,int y){push %ebpmov %esp,%ebpreturn x+y;mov 0xc(%ebp),%eaxadd 0x8(%ebp),%eax}movl %ebp,%esppop %ebpretebpespebpespebpyx
p2z=p2(x,y); pushl 0xfffffff8(%ebp) pushl 0xfffffff4(%ebp) call 804839b add $0x8,%esp mov %eax,0xfffffffc(%ebp)printf("%d=%d+%d\n",z,x,y); pushl 0xfffffff8(%ebp) pushl 0xfffffff4(%ebp) pushl 0xfffffffc(%ebp) push $0x8048510 call 80482b0 p2mainespebpyxebpcs:eipespebpespesp
mainint main(void){push %ebpmov %esp,%ebpsub $0x18,%esp char c='a'; movb $0x61,0xfffffff3(%ebp)int x,y,z;x=1; movl $0x1,0xfffffff4(%ebp)y=2; movl $0x2,0xfffffff8(%ebp)ebpebpespebpespespc=ax=1y=2
eipeipeipeipmainp1(c)p2(x,y)p1
p2
mainp2p1eipespmainceipeipeipp1espeipeipeipxyeipp2eipmainp1p2
mainp2p2p1
eipeipeipeipmainp2(x,y)p1
p2p1(c)mainp2p1eipespmainespeipeipxyeipp2eipeipeipeipceipp1espmainp1p2
C
#include
int main(){/* val1+val2=val3 */unsigned int val1 = 1;unsigned int val2 = 2;unsigned int val3 = 0;printf("val1:%d,val2:%d,val3:%d\n",val1,val2,val3);asm volatile("movl $0,%%eax\n\t" /* clear %eax to 0*/"addl %1,%%eax\n\t" /* %eax += val1 */"addl %2,%%eax\n\t" /* %eax += val2 */"movl %%eax,%0\n\t" /* val2 = %eax*/: "=m" (val3) /* output =m mean only write output memory variable*/: "c" (val1),"d" (val2)/* input c or d mean %ecx/%edx*/);printf("val1:%d+val2:%d=val3:%d\n",val1,val2,val3);
return 0;}
int (*f) (int x); /* */f=func; /* funcf */
void FileFunc() { printf(FileFunc\n); }
void EditFunc() { printf(EditFunc\n); } void (*funcp)(); void FileFunc(); void EditFunc();
main() { funcp=FileFunc; (*funcp)(); funcp=&EditFunc; funcp(); }
CPUCPU intel x86 CPU0-3Linux03
csCPUcs:eip cseipLinux0xc00000000x000000000xbfffffff:
vs /intcs:eip
324GBLinux3G3G4G4KB
Linux3G//
HomeworkCC32x86Linux
Tony HoareLinux