[BUUCTF]others_shellcode wp

0x00 前置知识 x86_32下应用程序调用系统调用的过程: 把系统调用号存入eax. 把函数参数存在其他寄存器(ebx, ecx, edx, esi, edi), 当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在 ebx 中保存指向该内存区域的指针. 触发0x80中断, 切换到内核态, 执行中断处理函数. (为了节约宝贵的中断号, Linux用int 0x80触发所有系统调用. 再为每个系统调用分配与中断号用法类似的系统调用号) 0x01 题目分析 IDA看到main函数里只执行了一个getShell()函数, 代码如下. int getShell() { int result; // eax char v1[9]; // [esp-Ch] [ebp-Ch] BYREF strcpy(v1, "/bin//sh"); result = 11; __asm { int 80h; LINUX - sys_execve } return result; } 插入了汇编代码int 0x80. 根据IDA的注释可以看到eax的值就是result的值11. 而32位下系统调用号11即为execve. 32位调用参数存在栈里, 此处即为栈顶的v[1]内的"/bin/sh". 所以相当于手动调用了系统调用execve("/bin/sh").

March 16, 2023 · 1 min · 59 words · JuicyMio

mayctf writeup by Mio and K-ON!

侠客行 crypto easy_md5 计算服务器给出的乱码字符串的md5码, 虽然很简单但是那个乱码字符串用recvuntil读进来是bytes类型, 转字符串再计算md5的处理折磨了我几天, 最后用一种比较离谱的办法搞出来了. #from re import L from pwn import * import binascii import hashlib,string,random context(log_level = 'debug', arch = 'amd64', os = 'linux') io = remote("124.220.41.254",11111) io.recvuntil(b"2.Go away\n") io.sendline(b"1") io.sendline(b"qwq") for i in range(6000): io.recvuntil(b"say Goodbye\n") io.sendline(b"1") io.recvuntil(b"it: \n") temp = io.recvuntil("your answer is:") print(type(temp)) print(temp) temp1 = binascii.hexlify(temp) print(type(temp1)) print(temp1) temp2 = str(temp1)[2:-33] # 把后面没用的部分和前面的b'切掉 print(temp2) temphex = temp2.encode() print("hex:" + str(temphex)) temp3 = binascii....

November 7, 2022 · 17 min · 3537 words · JuicyMio

奇技淫巧

收录遇到的各种奇技淫巧 位运算转换大小写 转小写 ('a' | ' ') = 'a' ('A' | ' ') = 'a' 转大写 ('b' & '_') = 'B' ('B' & '_') = 'B' 大小写互换 ('c' ^ ' ') = 'C' ('C' ^ ' ') = 'C' 原理: ' ' = 20 = 0b00100000 '_' = 95 = 0b01011111 'A' = 65 = 0b01000001 'a' = 97 = 0b01100001 'A' - 'a' = 20 = ' ' = 0b00100000 可以看到二进制ASCII码A与a差的就是100000, 其代表的是’ ‘, 所以进行一个或运算可以将大写字母第5位的0变成1而不影响别的位, 小写字母不变....

October 15, 2022 · 1 min · 91 words · JuicyMio

二进制数中1的个数是否为奇数

CSAPP第二章家庭作业2.65 /*Return 1 when x contains an odd number of 1s; 0 otherwise. Assume w=32 */ int odd_ones(unsigned x) 函数应该遵循位级整数编码规则,你的代码最多只能包含12个算术运算,位运算和逻辑运算. 代码 先上个代码 int odd_ones(unsigned x) { x ^= x >> 16; x ^= x >> 8; x ^= x >> 4; x ^= x >> 2; x ^= x >> 1; return x & 1; //http://stackoverflow.com/a/9133406 } 在使用循环的情况下就可以不用预先知道int的位数是多少,如下 int odd_ones(unsigned x) { int w = sizeof(x) * 8;//获得x有多少位二进制位,这里是32 int n = 1; while(n < w) { x ^= (x >> n); n <<= 1; } return x & 1; } 原理 由于异或的性质, 可以反映异或对应位上1的个数....

October 12, 2022 · 1 min · 152 words · JuicyMio

C/C++杂项知识点

用于记录一些比较奇怪/少见的c语法/易错易忘点/常见问题, 以备考试等用途 杂项中的杂项 编译没过先看报错信息, 不认识英文请善用翻译 如何提问: 先使用搜索引擎. 如果一定要问人, 附上全部 全部 全部 代码, 以及报错信息 报错信息 报错信息. 和一组出错了的输入输出, 以及注释或你对代码的解释. 因为阅读别人的代码是一件很烧脑的事. 错误示范: 代码截图, 我错哪了? 不要拍屏 查错技巧: 学习使用gdb, 设置断点并查看相关变量的值. 一个低配但很快的方法是用printf输出关键变量 关于CSDN: 虽然内容质量感人被StackOverflow等英文网站甩了十条街, 但还是有一些值得一看的文章的. 而且哪怕用百度查到csdn文章看了也比啥也不查直接问强. 输入数据之后卡住了怎么办: 查看你的代码里是否有死循环, 或者你的输入格式是否合法. 输入输出对不上: 看看格式控制符跟变量类型能否对应, 常见错误是用%f读入double类型变量. 报错信息里有cannot open output file .../*.exe: permission denied或者"无法打开xxx程序进行写入"之类的东西: 你之前的程序没关掉 输出了奇怪的数字: 大概率数组越界 Segmentation fault: 访问了不可访问的内存. 常见原因是数组越界, 指针漂移, 缓冲区溢出, 数组开太大爆栈… 带缺省值的参数需要放在后面, 这样在调用函数的时候就可以不写那个参数. 放在前面编译会报错. int f(int a = 0, int b); // wrong int f(int b, int a = 0); // right 字符串占用的空间要算上 ‘\0’...

October 12, 2022 · 2 min · 225 words · JuicyMio