일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c
- hackctf
- 숙명여자대학교 정보보안동아리
- 백준
- CSS
- siss
- WarGame
- The Loard of BOF
- c++
- XSS Game
- C언어
- 생활코딩
- lob
- 웹페이지 만들기
- 드림핵
- Python
- HTML
- Javascript
- 풀이
- PHP 웹페이지 만들기
- Sookmyung Information Security Study
- 파이썬
- 기계학습
- 자료구조 복습
- 머신러닝
- SWEA
- BOJ
- hackerrank
- BOJ Python
- 숙명여자대학교 정보보안 동아리
- Today
- Total
목록2021 SISS 21기 활동/여름방학 System (14)
혜랑's STORY
일단 바이너리 파일을 실행시켜 보았다. > 뒤에 입력을 받아서 AAAAAAAAAA를 입력해 주었고, Thank you! 라는 문장이 출력되며 프로그램이 종료되었다. checksec으로 바이너리 파일을 열어보자. 64bit 바이너리 파일이었고, Partial RELRO와 NX가 적용되어 있었다. Partial RELRO가 적용되어 있는 것으로 보아 got overwrite가 가능하다. IDA로 바이너리 파일을 열어보니 pwnm() 함수를 호출하고 있었고 pwnme() 함수는 read() 함수를 통해 s를 입력받은 때 선언된 s보다 더 많은 값을 입력받을 수 있어 overflow 취약점이 발생하게 된다. 함수 목록에서 usefulFunction() 함수를 발견하였다. print_file() 함수를 반환하여 ..
문제 해결에 필요한 파일들을 모두 다운받고 실행시켜 보았다. 모두 대문자로 입력하였는데 대문자와 소문자가 번갈아가며 출력되는 것을 볼 수 있다. checksec을 통해 보호기법을 확인해 보았는데 64bit 바이너리 파일이고 NX가 걸려있는 것을 확인할 수 있었다. IDA로 확인해보니 main 함수에서 convert_case()와 do_stuff()를 호출하고 있었고 각 함수의 수도코드를 확인하니 do_stuff() 함수에서 s를 __isoc99_scanf("%[^\n]", s); 로 입력을 받아 주고 있다. c언어에서 %[^\n]이 의미라는 바는 개행문자를 제외한 모든 문자를 입력받는 것으로 gets(s); 와 같은 역할을 하게 된다. 즉, 이 코드에서 overflow가 발생하게 된다. GDB Explo..
오늘 해결할 문제는 이 사이트의 add 문제이다. 역시 실행을 위해 권한을 부여했다. chmod +x challenge 일단 파일을 실행해보자. 그냥 종료된다. checksec으로 보호기법을 확인해보자. 64 bit 바이너리 파일이고, canary와 nx가 걸려있다. IDA로 통해 코드와 함수 목록을 확인해 보았다. 숫자 형식으로 입력을 받고 반환값이 3이 아니면 while문을 탈출하는 코드였다. 함수 목록을 살펴보니 win() 이라는 함수가 있었다. while문을 탈출하고 win으로 이동하여 flag를 출력해야 하는 문제인 것 같다. 일단 숫자를 입력해 보았는데 앞에 입력받은 두 수의 합을 3번째 숫자가 인덱스가 되는 자리에 저장하는 것 같았다. 이때 엄청 큰 수를 입력하거나 작은 수를 입력하게 되면 ..
오늘 해결할 문제는 이 사이트의 sub 문제이다. 다운로드를 눌러 문제를 다운받았고, chmod를 사용하여 파일을 실행할 수 있도록 바꿔주었다. chmod +x challenge 파일을 실행하고 AAAA를 입력하였더니 그냥 프로그램이 종료되었다. checksec을 통해 파일에 어떤 보호기법이 걸려있는지 확인하였다. 64 bit 바이너리 파일이었고 모든 보호기법이 다 걸려있었다. IDA를 통해 코드를 확인해 보았는데 v4랑 v5의 차가 4919가 되면 flag를 출력해준다. 앞에서 친절히 v4와 v5를 입력을 받는데 별 다른 제한이 없기때문에 4918과 -1을 입력 해주었다. 출력할 flag가 없다고 한다. 이제 진짜 서버로 해보자! 성공이다.
checksec 64 bit 바이너리 파일이고, NX가 걸려있다. IDA rand() 함수가 사용되어 v5값이 실행될 때마다 바뀌는 것 같다. 그런데 아래 if문을 보면 v5와 v4값이 같아야 flag를 출력할 수 있다. 즉, 랜덤으로 생성되어 v5에 저장될 때 v4에도 저장되어야 할 것 같다. Exploit method rand() 함수의 값과 같은 값을 입력하는 방법을 검색해 보았더니, 동적라이브러리로 rand함수와 똑같은 코드를 작성하고 .so 파일을 만들어서 import 시키면 같은 값을 가져올 수 있다고 한다. time.c 코드 작성 gcc -shared -o time.so -fPIC time.c #include #include #include int solve(); int solve(){ sr..
# checksec 64bit 파일이고, NX가 걸려있다. # IDA read() 함수에서 buf의 크기보다 더 많이 입력받을 수 있어서 overflow가 일어난다. 함수 목록을 살펴보니 __libc_init() 함수가 있다. return-to-csu를 사용하여 문제를 해결하면 될 것 같다. # Debugging [Break Point] 0x4005f6 : main 함수 코드 첫 부분 0x40064b : read() 함수 호출 전 즉, 문자를 72개 이상 입력하면 return address를 덮어쓸 수 있다. # Exploit objdump -M intel -d ./rtc 사용할 가젯 0x4006ba : pop rbx - csu_call csu_call을 실행하고 rbp가 1이면 자동으로 csu_init..
# Checksec 64bit 바이너리 파일이고, NX가 걸려있다. # IDA 함수 목록을 살펴보니 __libc_init() 함수가 있었다. 따라서 앞서 공부했던 return-to-csu를 사용하여 문제를 해결해 볼 것이다. # Debugging Break Point 0x4005f6 : main 함수 코드 첫 부분 0x40064b : read() 함수 호출 전 즉, 56개 이상의 문자를 입력함으로써 Return address 영역을 덮어 쓸 수 있다. Exploit method ROP 기법을 이용한 Exploit 순서는 다음과 같다. 1번째 ROP Chain a. write() 함수를 이용하여 __libc_start_main@GOT 영역에 저장된 libc 주소를 추출합니다. b. read() 함수를 이용..
return-to-vuln이란 ROP 코드를 실행한 후에 취약성이 있는 코드로 다시 이동하는 것을 말한다. return-to-dl-resolve 기법에서 스택의 흐름을 변경하기 위해 "leave; ret;" gadget을 이용할 수 있다. 그러나 clang으로 컴파일된 바이너리 파일에서는 "leave; ret;"을 찾을 수 없다. GCC vs Clang 다음과 같이 GCC로 컴파일된 파일에서 "leave; ret;" gadget을 찾을 수 있다. 그러나 Clang으로 컴파일된 파일에서는 찾을 수 없다. 다음과 같이 Clang으로 컴파일된 바이너리는 스택(엔트리 포인트)을 정리할 때 "leave" 명령어가 사용되지 않는다. objdump -d rop 이러한 문제를 해결하기 위해 Return-to-vuln ..