https://q.qlogo.cn/headimg_dl?dst_uin=46113931&spec=640&img_type=jpg

Tupler's Blog~

[Re/UCTF2020]LLVM IR

0x00 LLVM IR的题 根据官方文档可以 慢慢啃 加密代码很短 参考文章 LLVM Language Reference Manual — LLVM 17.0.0git documentation 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 @check = dso_local global [64 x i8] c"\03\12\1A\17\0A\EC\F2\14\0E\05\03\1D\19\0E\02\0A\1F\07\0C\01\17\06\0C\0A\19\13\0A\16\1C\18\08\07\1A\03\1D\1C\11\0B\F3\87\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\05", align 16, !

[免杀]ipv6格式shellcode免杀

0x00.前言 众所周知 IPV6的格式为 0 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 每个部分有4个十六进制数组成 相当于2byte 0x01.原理 我们可以将shellcode转换为这样的格式 然后利用windows的API RtlIpv6StringToAddressA 进行将我们IPV6字符串转化为十六进制的shellcode 存在堆栈或者段中然后执行 0x02.实践 在Python中我们可以利用ipaddress下的IPv6Address 类的构造函数进行将十六进制的字符串转化为shellcode 具体实现代码: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import ipaddress buf = b'''\xff\x0A\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff''' def convertToIPV6(shellcode): if len(shellcode)%16 !=0: print("shellcode大小:",len(shellcode)+(16-(len(shellcode)%16))) addNullbyte = b"\x00" * (16-(len(shellcode)%16)) shellcode += addNullbyte ipv6 = [] for i in range(0, len(shellcode), 16): ipv6.append(str(ipaddress.IPv6Address(shellcode[i:i+16]))) print(ipv6) if __name__ == '__main__': r = convertToIPV6(buf) print(str(r).

2022年终总结

0x00.序 2022已经结束咧,2022摆烂了很久 希望2023年能好一点点吧,被一大堆负面新闻充斥,对以后的就业又开始焦虑呜呜。。 0x01.时光机 1月: 好像摆烂了一个月 考驾照搞了一个月都没咋学习。 2月:去学校了这个时候疯狂摆烂。。 3-6月:摆烂 7月-8月:学车 成功拿到了驾驶证! 然而没要钱买车 9月:这个月受一些影响开始疯狂学习 看了《逆向工程核心原理》《加密与解密》《Rootkit与bootkit》 学了pwn的一些基本的利用(pwn还是太难了呜呜 10月:研究了一些远控相关的东西 学了些红队的姿势 研究了360核晶 研究了编写shellcode 11月:学习了PE LOADER ,PE相关的东西 学习了一些病毒分析的知识 12月:摆烂月 本在学校复习的 突如起来的开放 让我们滚回家 然后还阳了 在家摆烂呜呜 0x02.技术方面 增长了一些逆向的经验,学习了一些病毒木马的利用,学习了CTF pwn的知识 :( 然而打CTF还是菜的一笔 因为ctf而去学了相关的linux知识 (我一直是windows党啊!) 对C/C++ 在win32下的知识更加透彻了一丢丢 。真就是一丢丢 win32太复杂了 各种API 0x03.日常方面 没什么改变,还是一个人 一些志同道合的朋友 番到是看了一堆 心中的年度动漫《赛博朋克2077:边缘行者》 0x04.终 最后祝大家2023快乐,也希望自己的技术在2023年能得到一些变化! 2022已经结束咧!!!!!

[免杀]手动编写&获取ShellCode

shellcode获取 0x00 前言 这几天在搞注入的时候由于各种原因MSF,CS生成的shellcode不能实现写注册表这个单纯的需求(也可能是我没找到? 于是乎就想着自己写. 0x01 通过FS(32位)/GS(64位)获取TEB 再通过偏移获取PEB FS寄存器指向的为TEB结构 TEB(ThreadEnvironmentBlock)线程进程块 记录着 线程的信息 typedef struct _TEB { NT_TIB Tib; /* 00h */ PVOID EnvironmentPointer; /* 1Ch */ CLIENT_ID Cid; /* 20h */ PVOID ActiveRpcHandle; /* 28h */ PVOID ThreadLocalStoragePointer; /* 2Ch */ /*此处*/ struct _PEB *ProcessEnvironmentBlock; /* 30h */ ULONG LastErrorValue; /* 34h */ ULONG CountOfOwnedCriticalSections; /* 38h */ PVOID CsrClientThread; /* 3Ch */ struct _W32THREAD* Win32ThreadInfo; /* 40h */ ULONG User32Reserved[0x1A]; /* 44h */ ULONG UserReserved[5]; /* ACh */ PVOID WOW32Reserved; /* C0h */ LCID CurrentLocale; /* C4h */ ULONG FpSoftwareStatusRegister; /* C8h */ PVOID SystemReserved1[0x36]; /* CCh */ LONG ExceptionCode; /* 1A4h */ struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */ UCHAR SpareBytes1[0x28]; /* 1ACh */ GDI_TEB_BATCH GdiTebBatch; /* 1D4h */ CLIENT_ID RealClientId; /* 6B4h */ PVOID GdiCachedProcessHandle; /* 6BCh */ ULONG GdiClientPID; /* 6C0h */ ULONG GdiClientTID; /* 6C4h */ PVOID GdiThreadLocalInfo; /* 6C8h */ ULONG Win32ClientInfo[62]; /* 6CCh */ PVOID glDispatchTable[0xE9]; /* 7C4h */ ULONG glReserved1[0x1D]; /* B68h */ PVOID glReserved2; /* BDCh */ PVOID glSectionInfo; /* BE0h */ PVOID glSection; /* BE4h */ PVOID glTable; /* BE8h */ PVOID glCurrentRC; /* BECh */ PVOID glContext; /* BF0h */ NTSTATUS LastStatusValue; /* BF4h */ UNICODE_STRING StaticUnicodeString; /* BF8h */ WCHAR StaticUnicodeBuffer[0x105]; /* C00h */ PVOID DeallocationStack; /* E0Ch */ PVOID TlsSlots[0x40]; /* E10h */ LIST_ENTRY TlsLinks; /* F10h */ PVOID Vdm; /* F18h */ PVOID ReservedForNtRpc; /* F1Ch */ PVOID DbgSsReserved[0x2]; /* F20h */ ULONG HardErrorDisabled; /* F28h */ PVOID Instrumentation[14]; /* F2Ch */ PVOID SubProcessTag; /* F64h */ PVOID EtwTraceData; /* F68h */ PVOID WinSockData; /* F6Ch */ ULONG GdiBatchCount; /* F70h */ BOOLEAN InDbgPrint; /* F74h */ BOOLEAN FreeStackOnTermination; /* F75h */ BOOLEAN HasFiberData; /* F76h */ UCHAR IdealProcessor; /* F77h */ ULONG GuaranteedStackBytes; /* F78h */ PVOID ReservedForPerf; /* F7Ch */ PVOID ReservedForOle; /* F80h */ ULONG WaitingOnLoaderLock; /* F84h */ ULONG SparePointer1; /* F88h */ ULONG SoftPatchPtr1; /* F8Ch */ ULONG SoftPatchPtr2; /* F90h */ PVOID *TlsExpansionSlots; /* F94h */ ULONG ImpersionationLocale; /* F98h */ ULONG IsImpersonating; /* F9Ch */ PVOID NlsCache; /* FA0h */ PVOID pShimData; /* FA4h */ ULONG HeapVirualAffinity; /* FA8h */ PVOID CurrentTransactionHandle; /* FACh */ PTEB_ACTIVE_FRAME ActiveFrame; /* FB0h */ PVOID FlsData; /* FB4h */ UCHAR SafeThunkCall; /* FB8h */ UCHAR BooleanSpare[3]; /* FB9h */ } TEB, *PTEB; 所以我们FS:[30]就是我们的PEB

PE结构学习

壳执行流程 壳程序入口—>解密原程序—>重定位—>EIP指向源程序OEP PE DOS header PE header SECTION table VA: 虚拟内存地址(Virtual Address) PE 文件被操作系统加载进内存后的地址。 RVA: PE文件的相对虚拟地址(Relative Virual Address) 是PE文件中的数据、模块等运行在内存中的实际地址相对PE文件装载到内存的基址之间的距离。举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h。 FOA: 文件偏移地址(File Offset Address),和内存无关,它是指某个位置距离文件头的偏移。 RVA FOA RVA->VA VA=ImageBase+RVA FOA->VA 1.RVA找到所在Section 2.Section RVA-SECTIONBASE 3.RAW+OFFSET 简化:FOA=(RVA-SECTIONRVA)+BASEFOA 导入表 IMAGE_IMPORT_DESCRIPTOR 每个IID代表一个DLL 0 1 2 3 4 5 6 7 8 9 10 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; // 指向 导入名称表INT(ImportNameTable)的RVA } DUMMYUNIONNAME; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; // 指向 DLL名称的地址 RVA DWORD FirstThunk; // 指向 导入地址表IAT(ImportAddressTable)的RVA } IMAGE_IMPORT_DESCRIPTOR; typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR; FirstThunk -》IAT

[Pwn]unsorted bin Attack

unsorted bin Attack 当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。 释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。关于 top chunk 的解释,请参考下面的介绍。 当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是和 top chunk 近邻的话。 unsorted bin attack 原理 ~~管理时为循环双向链表 所以里面必有一个节点 一开始时 unsorted bin 的 fd和bk都指向本身 我们free掉一个chunk(p) 然后因为不在fastbin大小中 就归到unsorted bin里 插入的时候插入到 unsorted bin 的头部,取出的时候从链表尾获取 所以这里会将unsorted bin的fd和bk指向我们的 0 1 2 3 victim = unsorted_chunks(av)->bk=p //这里就是我我们的free掉的那个p bck = victim->bk=p->bk = target addr-16//bck=p的bk 也就是我们要修改的地址-16是因为等会儿他要改这个地址的FD 而FD的偏移就是16 所以减去16 unsorted_chunks(av)->bk = bck=target addr-16//令unsortedbin的FD指向我们的地址(因为我们把p的chunk给取走了 他要构成循环链表要把后面的接上来(我们默认的free到unsortedbin的地址就是我们unsrotedBin本身地址)) bck->fd = *(target addr -16+16) = unsorted_chunks(av);//这里就是将unsorted_chunks(av)->bk->fd改成unsorted bin地址 例题1.