分析
checksec
123➜ pwn checksec --file=not_the_same_3dsctf_2016RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILEPartial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 1991) Symbols No 0 0 not_the_same_3dsctf_2016
ida
12345678int __cdecl main(int argc, const char **argv, const char **envp){ char v4[45]; // [esp+Fh] [ebp-2Dh] BYREF printf("b0r4 v3r s3 7u 4h o b1ch4o m3m0 ...
分析
checksec一下
[*]’/home/admin233/下载/babyropArch:amd64-64-littleRELRO:Partial RELROStack:No canary foundNX:NX enabledPIE:No PIE(0x400000)Stripped:No
NX保护开启的
ida分析
123456789int __cdecl main(int argc, const char **argv, const char **envp){ char v4[16]; // [rsp+0h] [rbp-10h] BYREF system("echo -n \"What's your name? \""); __isoc99_scanf("%s", v4); printf("Welcome to the Pwn World, %s!\n", v4); return 0;}
__isoc99_sca ...
分析
checksec分析
123➜ pwn checksec --file=bjdctf_2020_babystack2RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILEPartial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 75) Symbols No 0 1 bjdctf_2020_babystack2
开启了NX保护
ida分析
12345678910111213141516171819202122232425int __cdecl main(int argc, const char **argv, const char **envp){ char buf[12]; // [rsp+0h] [rbp-10h] BYREF size ...
分析
安全保护
1234567[*] '/home/admin233/pwn/ciscn_2019_en_2' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) Stripped: No
开启了NX,栈上溢出运行不可行了
ida分析
123456789101112131415161718192021222324252627282930313233343536373839int __cdecl main(int argc, const char **argv, const char **envp){ int v4; // [rsp+Ch] [rbp-4h] BYREF init(argc, argv, envp); puts("EEEEEEE ...
分析
安全保护
123456Arch: i386-32-littleRELRO: Partial RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x8048000)Stripped: No
ida分析
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061int __cdecl main(int argc, const char **argv, const char **envp){ int result; // eax int v4; // [esp+0h] [ebp-100h] BYREF char src[4]; // [esp+4h] [ebp-FCh] BYREF char v6[124]; // [esp+8h] [ebp-F8h] BYREF cha ...
信息安全
未读分析
checksec
123➜ pwn checksec --file=fm RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILEPartial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH 73) Symbols No 0 2 fm
ida
123456789101112131415161718int __cdecl main(int argc, const char **argv, const char **envp){ char buf[80]; // [esp+2Ch] [ebp-5Ch] BYREF unsigned int v5; // [esp+7Ch] [ebp-Ch] v5 = __readgsdword(0x14u); ...
分析12345Arch: i386-32-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: PIE enabled
保护全开
ida查看一下逻辑:
12345678910111213141516171819202122232425262728293031323334353637383940int __cdecl main(int argc, const char **argv, const char **envp){ int v4; // [esp-14h] [ebp-20h] int v5; // [esp-10h] [ebp-1Ch] var[13] = 0; var[14] = 0; init(); puts("What's your name?"); __isoc99_scanf("%s", var, v4, v5); if ( *(_QWORD *)&var[13] ) ...
信息安全
未读分析直接拖入ida,F5查看源码:
12345int __cdecl main(int argc, const char **argv, const char **envp){ vuln(); return 0;}
查看vuln函数实现:
12345678910111213141516171819202122232425262728int vuln(){ const char *v0; // eax char s[32]; // [esp+1Ch] [ebp-3Ch] BYREF char v3[4]; // [esp+3Ch] [ebp-1Ch] BYREF char v4[7]; // [esp+40h] [ebp-18h] BYREF char v5; // [esp+47h] [ebp-11h] BYREF char v6[7]; // [esp+48h] [ebp-10h] BYREF char v7[5]; // [esp+4Fh] [ebp-9h] BYREF printf("Tell me something ...
信息安全
未读原始 GDB 不适合用于逆向工程和漏洞开发。输入x/g30x $esp并不好玩,而且无法提供太多信息。因此,pwndbg便应运而生。pwndbg是一个直接加载到 GDB 中的 Python 模块,它提供了一套实用程序和辅助工具来解决 GDB 中的所有问题并消除粗糙的边缘。
安装123git clone https://github.com/pwndbg/pwndbg.gitcd pwndbg./setup.sh
配置
查看
1cat .gdbinit
保留pwndbg source,其他的注释掉
使用指令
help //帮助
i //info,查看一些信息,只输入info可以看可以接什么参数,下面几个比较常用
i b //常用,info break 查看所有断点信息(编号、断点位置)
i r //常用,info registers 查看各个寄存器当前的值
i f //info function 查看所有函数名,需保留符号
show //和inf ...
通用寄存器对于 x86-64 架构,共有16个64位通用寄存器,各寄存器及用途如下图所示:
每个寄存器的用途并不是单一的。
%rax 通常用于存储函数调用的返回结果,同时也用于乘法和除法指令中。在imul 指令中,两个64位的乘法最多会产生128位的结果,需要 %rax 与 %rdx 共同存储乘法结果,在div 指令中被除数是128 位的,同样需要%rax 与 %rdx 共同存储被除数。
%rsp 是堆栈指针寄存器,通常会指向栈顶位置,堆栈的 pop 和push 操作就是通过改变 %rsp 的值即移动堆栈指针的位置来实现的。
%rbp 是栈帧指针,用于标识当前栈帧的起始位置
%rdi, %rsi, %rdx, %rcx,%r8, %r9 六个寄存器用于存储函数调用时的6个参数(如果有6个或6个以上参数的话)。
被标识为 “miscellaneous registers” 的寄存器,属于通用性更为广泛的寄存器,编译器或汇编程序可以根据需要存储任何数据。
“Caller Save” 和 ”Callee Save” 寄存器这里还要区分一下 “Caller Save” 和 ”Callee ...