int __fastcall main(int argc, constchar **argv, constchar **envp) { int n2; // [rsp+Ch] [rbp-4h] BYREF init(argc, argv, envp); puts("EEEEEEE hh iii "); puts("EE mm mm mmmm aa aa cccc hh nn nnn eee "); puts("EEEEE mmm mm mm aa aaa cc hhhhhh iii nnn nn ee e "); puts("EE mmm mm mm aa aaa cc hh hh iii nn nn eeeee "); puts("EEEEEEE mmm mm mm aaa aa ccccc hh hh iii nn nn eeeee "); puts("===================================================================="); puts("Welcome to this Encryption machine\n"); begin(); while ( 1 ) { while ( 1 ) { fflush(0); n2 = 0; __isoc99_scanf("%d", &n2); getchar(); if ( n2 != 2 ) break; puts("I think you can do it by yourself"); begin(); } if ( n2 == 3 ) { puts("Bye!"); return0; } if ( n2 != 1 ) break; encrypt(); begin(); } puts("Something Wrong!"); return0; }
begin函数
1 2 3 4 5 6 7 8
intbegin() { puts("===================================================================="); puts("1.Encrypt"); puts("2.Decrypt"); puts("3.Exit"); returnputs("Input your choice!"); }
graph TD A[程序启动] --> B{选择进入存在漏洞的函数}; B -- Choice '1' --> C[第一次栈溢出: 泄露Libc地址]; C --> D[构造第一次ROP链:<br>填充数据88字节<br>pop rdi; ret<br>puts@got地址<br>puts@plt地址<br>main地址]; D --> E[sendlinepayload1]; E --> F[程序执行gets, 栈被溢出]; F --> G{程序执行到encrypt函数返回}; G --> H[跳转到ROP链: 执行 putsputs@got]; H --> I[程序将puts真实地址打印到stdout]; I --> J{脚本接收并解析泄露的地址}; J --> K[计算Libc基址、system地址、/bin/sh地址]; K --> L{程序返回到main函数}; L --> M[第二次栈溢出: 获取Shell]; M --> N[构造第二次ROP链:<br>填充数据 88字节<br>ret gadget 栈对齐<br>pop rdi; ret<br>/bin/sh地址<br>system地址]; N --> O[sendlinepayload2]; O --> P[程序执行gets, 栈再次被溢出]; P --> Q{程序执行到encrypt函数返回}; Q --> R[跳转到第二次ROP链: 执行 system'/bin/sh']; R --> S[获得Shell];