GDB基本使用及pwn常用命令
GDB基本使用及pwn常用命令i r查看寄存器 start 运行程序,停在 main 函数的第一行。 run 从程序的入口点开始执行,并会一直运行,直到.程序正常结束。 b main ,b *(0xdsds)设置断点 i b查看断点,d main删除断电,disable b 2,让断点失效。enable b 3 si会进入xx方法实现的里面 ni是下一步。finish步出 c继续 显示从地址0x100开始的10个十六进制数:x/10x 0x100 显示从寄存器$rax开始的4个无符号十进制数:x/4uw $rax 显示字符数组str的内容,直到遇到’\0’结束:x/s str x/20g $rbp-0x20:这个命令表示从地址$rbp-0x20开始,以十六进制格式打印20个g大小的内存单元。这里的g通常代表8字节(64位)的巨量(giant word)。所以它会打印20个8字节的值,总共160字节的数据。这种格式通常用于查看较大数值或指针地址(在64位系统上指针也是8字节)。 x/20b...
逆向攻防世界CTF系列5-open-source
逆向攻防世界CTF系列5-open-source12345678910111213141516171819202122232425262728293031323334#include <stdio.h>#include <string.h>int main(int argc, char *argv[]) { if (argc != 4) { printf("what?\n"); exit(1); } unsigned int first = atoi(argv[1]); if (first != 0xcafe) { printf("you are wrong, sorry.\n"); exit(2); } unsigned int second = atoi(argv[2]); if (second % 5 == 3 || second % 17 != 8) { ...
pwn细节
pwn细节send和sendlineread(fd, buf, count) 文件描述符,为0,从输入的缓冲区中读取(标准输入),通俗理解为从哪读,即使超过count也能输入到缓冲区;读到哪;读入字符数。 sendline和send都是发送数据,sendline会在发送的数据末尾加一个回车。而这个回车所造成的影响,是跟对应的输入函数有关系,输入函数有scanf(”%s”),gets(),read(),fgets(),这四个函数。 read会把这个回车(ASCII码也就是0a)存入到栈中 输入的数据先是放入了缓冲区中,再从缓冲区中写到了指定的地址,虽然sendline的回车没有被写进去,但是回车停留在了缓冲区中。接下来如果有gets函数需要获取输入的话,gets函数会因为这个缓冲区里的回车直接结束,不会从用户这里获取输入。 使用 gets() 时,系统会将最后输入的换行符(也就是回车)从缓冲区中取出来,然后给舍弃,因此缓冲区中不会遗留换行符(不用考虑send和sendline的区别) scanf是从第一个非空白字符(空格 换行...
逆向攻防世界CTF系列4-re1
逆向攻防世界CTF系列4-re1 查壳,无壳32位 进到这 分析一波,只有v3是正的才会输出aflag,也就是v9和v5.mxxx相等,又看到v5和xmmmword有关,直接点进去: 右键双击两下,列表中和有转化好的值,完成转化,拼接得到结果: 这里有个知识点,大端与小端 。假设一个十六进制数0x12345678 大端的存储方式是:12,34,56,78,然后读取的时候也是从前往后读 小端的存储方式是:78,56,34,12,然后读取的时候是从后往前读取 正的发现不对,所以,最后的flag应该是:DUTCTF{We1c0met0DUTCTF}
pwn入门-ret2text+ROP详解
pwn入门-ret2text+ROP详解1234567#关闭栈保护gcc question_4_1.c -m32 -fno-stack-protector -o main#全部关闭gcc -no-pie -fno-stack-protector -z execstack -m32 -o 3.exe 3.c#-no-pie:地址随机化#-fno-stack-protector:没有堆栈保护#-z execstack:堆栈可执行 ret2text 即控制程序执行程序本身已有的的代码 (即, .text 段中的代码) 。其实,这种攻击方法是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是 gadgets),这就是我们所要说的...
逆向攻防世界CTF系列3-game
逆向攻防世界CTF系列3-game打开看下: 玩一个游戏n 是灯的序列号,m 是灯的状态。如果第 N 盏灯的 m 为 1,则灯亮,否则灯灭。起初所有的灯都是关闭的,现在您可以输入 n 来改变它的状态,但您要注意一点,如果您改变了第 N 盏灯的状态,第 (N-1) 盏灯和第 (N+1) 盏灯的状态也会随之改变。当所有灯都亮起时,会出现flag,现在输入 n.n(1-8) 解法一:一次输入12345678,得到flag(看的其他大佬,用广度优先,不理解为什么可以用广度…) 解法二:扔到exeinfo查,无壳,32位exe 扔到ida,shift+F12没找到flag f5找到main(当然你也可以一开始就F5然后一直点进函数内部也可以到main) 关键是这段 解释一下,就是只要不全为1就会一直循环,全为1则执行sub_457AB4();,注意sub_457AB4();是在循环外部,不在里面。 点进sub_457AB4(); 最后到达这: return的应该是flag 我们把这段伪代码转成python去运行得到flag: 注意qmemcpy(v2, “{ “,...
pwn入门-ret2syscall
pwn入门-ret2syscall静态编译怎么办?如果没system怎么办? system封装的execve 1int execve(const char *filename, char *const argv[], char *const...
逆向攻防世界CTF系列2-insanity
逆向CTF系列2-insanity直接扔入peid中,发现不是一个有效的PE文件 其实很简单,就是PEiD只支持检测32位的可执行文件,如果显示不是有效的PE文件,说明你的可执行文件为64位,不能用PEiD检测 下面使用Exeinfo PE查看,Exeinfo相当于PEiD的升级版,可查看64位的可执行文件 因此下载exeinfo pe 由此可以发现这是一个ELF32位的文件。 目前我们常见的两大主流平台分别是 Linux 和 Windows;在前者环境下,其主要的可执行文件对应的名称为 ELF(Executable and Linking Format)文件;在后者环境下,其可执行文件对应的名称为 PE(Portable Executable)文件。 扔入IDA,F5,发现strs,可疑,ctrl+点击点进去看看 查到flag 其实还有第二种方法,看了大佬的wp,在这阐述下: 直接shift+F12查看字符串变量 也能查到 .rodata:08048788 00000015 C 9447{This_is_a_flag}
pwn入门-ret2shellcode
pwn入门-ret2shellcode先看我的另一篇文章,shellcode详解 例一12345678910111213141516#include <stdio.h>#include <stdlib.h>#include <unistd.h>int dofunc(){ char b[0x100]; puts("input:"); read(0,b,0x100); ((void (*) (void)) b)(); return 0;}int main(){ dofunc(); return 0;} NX:栈不可执行 123456789101112131415from pwn import *context(log_level='debug',arch='amd64', os='linux')pwnfile= './question_6_1_x64'io =...
Android逆向4-动态调试&Log插桩
Android逆向4-动态调试&Log插桩动调动态调试步骤 1 修改权限 方法一:在AndroidManifest.xml里添加可调试权限 1android:debuggable="true" 方法二:XappDebug模块hook对应的app 项目地址:XappDebug 右上角设置showa already debug 方法三:Magisk命令(重启失效) 12345671. adb shell #adb进入命令行模式2. su #切换至超级用户3. magisk resetprop ro.debuggable 14. stop;start; #一定要通过该方式重启 方法四:刷入MagiskHide Props...