분류 전체보기
[pwnable.xyz] l33t-ness write up
[pwnable.xyz] l33t-ness write up
2020.01.31pwnable.xyz 12번째 문제 l33t-ness 이다. Analyze 이번 문제는 간단한(?) 수학 3문제를 풀면 flag를 출력하게 된다. 문제의 바이너리 파일에 사용자 정의 함수를 보면 아래와 같다. handler main round_1 round_2 round_3 setup win gdb로 분석하여 c코드로 나타내면 아래와 같다. #include #include int round_1(){ int getInt_1 = 0; // rbp-0x38 int getInt_2 = 0; // rbp-0x34 char tmp; // rbp-0x30 printf("=== 1eet ===\n"); memset(tmp, 0, 0x20); printf("x: "); read(0, tmp, 0x10); printf("..
[pwnable.xyz] Jmp table write up
[pwnable.xyz] Jmp table write up
2020.01.31pwnable.xyz 11번째 문제 Jmp table 이다. Analyze 위 문제의 사용자 정의 함수를 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/11_Jump_table $ func challenge _ do_exit do_free do_malloc do_read do_write handler main print_menu read_long setup 문제의 바이너리 파일을 gdb로 분석하여 c코드로 나타내면 아래와 같다. /* _ v 0x0000000000400a31 b do_exit v b do_free v b do_malloc v b do_read v b do_write v b handler b main v b print_menu v b read_long..
[pwnable.xyz] TLSv00 write up
[pwnable.xyz] TLSv00 write up
2020.01.28pwnable.xyz 의 10번째 문제 TLSv00 이다. Analyze 문제 파일의 사용자 정의 함수를 보면 많은 함수들이 존재하는 것을 볼 수 있다. 위 함수들을 gdb로 분석하여 c언어로 표현하면 아래와 같다. #include #include char key[64]; // 0x555555756040 char do_comment[16]; // 0x555555756080 char flag[64]; // 0x5555557560a0 void print_menu(){ printf("1. Re-generate key\n2. Load flag\n3. Print flag\n"); } int read_int32(){ memset(&rbp-0x30, 0, 0x20); *(&rbp-0x34) = read(0, &rbp..
64bits 인자 값 전달 방식 순서
64bits 인자 값 전달 방식 순서
2020.01.28[Linux - ELF] Parameter 1 - rdi Parameter 2 - rsi Parameter 3 - rdx Parameter 4 - rcx Parameter 5 - r8 Parameter 6 - r9 Parameter 7 - (%rsp) Parameter 8 - 0x8(%rsp) system call - %rax
[pwnable.xyz] free spirit write up
[pwnable.xyz] free spirit write up
2020.01.27pwnable.xyz 9번째 문제 free spirit 이다. 앞에 문제보다 시간을 꽤 소모 했고, 이해하기도 힘들었고, 배운 것들이 많았던 문제 였다. 문제를 풀기 위해서는 Heap의 구조, fastbin, House of spirit 에 대해 알고 있어야 한다. Analyze 이번 문제의 바이너리 안에 사용자 정의 함수를 찾아보면, main과 win 함수 말고는 특벌한 함수는 없다. main 함수를 gdb로 분석하여 c 코드로 나타내면 아래와 같다. #include ??? limit; // 0x60102c int main(){ *(&rsp+0x10) = malloc(0x40); // 0x602260 // &rsp+0x10 = 0x7fffffffe460 while(1){ printf("> "); rea..
[pwnable.xyz] note write up
[pwnable.xyz] note write up
2020.01.25pwnable.xyz 에서 6번째 문제 note 이다. Analyze 이번 문제의 사용자 정의 함수를 찾아보면 여러개가 있다는 것을 알 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/06_note $ func challenge b edit_desc b edit_note b handler b main b print_menu b read_int32 b setup b win 해당 바이너리 파일을 gdb로 분석하여 c 코드로 나타내면 아래와 같다. #include #include #include char s[48]; int read_int32(){ read(0, &rbp-0x30, 0x20); *(&rbp-0x30) = atoi($rbp-0x30); return *(&rbp-0x3..
[pwnable.xyz] Grownup write up
[pwnable.xyz] Grownup write up
2020.01.25pwnable.xyz 의 5번째 문제 grownup 문제이다. Analyze 이번 문제의 사용자 정의 함수를 보면 특별한 함수는 없어 보인다. $ func GrownUpRedist b handler b main b setup gdb로 main 함수를 분석하여 c 코드로 나타내면 아래와 같다. #include #include #include int main(){ char a[16]; char tmp; printf("Are you 18 years or older? [y/N]:"); read(0, a, sizeof(a)); switch (a[0]){ case 'y': tmp = malloc(0x84); // &tmp = 0x602260 printf("Name: "); read(0, tmp , 0x80); //..
[pwnable.xyz] two targets write up
[pwnable.xyz] two targets write up
2020.01.02pwnable.xyz 8번째 문제 two targets 이다. 바이너리를 실행하면 아래 처럼 유저에게 name, nationality, age를 입력받는 것을 볼 수 있다. 4번을 누를 시 어떤 조건에 만족 한다면 flag를 획득 할 수 있는 것 같다. 이 문제는 제목 그대로 2개의 타겟이다. 2가지 중 하나의 방법을 택하여 문제를 풀 수 있다. 아래에는 2가지 풀이 법을 설명 해놓았다. Analyze 1 (GOT overwrite) challenge 바이너리에는 아래처럼 여러개의 사용자 정의 함수가 있을 것을 볼 수 있다. 이번에 auth 라는 새로운 함수가 등장했다. main 함수를 gdb로 분석해서 간단하게 pseudo code로 나타내면 아래와 같다. 반복 기능도 넣어야 하지만 중요한 부분만 ps..
[pwnable.xyz] xor write up
[pwnable.xyz] xor write up
2020.01.01pwnable.xyz 7번째 문제 xor 이다. 실행하면 아래와 같다. Analyze 이번 문제도 main 함수와 win 함수 말고 특별한 것은 보이지 않는다. gdb 로 main 함수를 분석 해보자. 아래 사진은 main 함수의 일부분이다. 이를 pseudo 코드로 나타내면 아래와 같다. 이번에도 8번째 줄에 Arbitrary overwrite 공격이 가능하다. 하지만 main 함수에서 역할은 XOR 연산하는 과정 말고는 없다. main 함수에 breakpoint를 걸어 vmmap 명령어를 사용하면 아래처럼 0x0000555555554000 ~ 0x0000555555555000 까지 rwxp 권한이 있는 것을 볼 수 있다. 즉, main 함수에서 특정 주소에 있는 명령어를 변조하여 공격자가 원하는 함수..
[pwnable.xyz] misalignment write up
[pwnable.xyz] misalignment write up
2020.01.01pwnable.xyz 4번째 문제 misalignment 이다. 실행 해보면 아래와 같다. Analyze 이 문제에 사용자 정의 함수는 아래와 같다. 위 바이너리 파일을 peda-gdb 로 열어 main 함수의 어셈블리어를 보자. 아래 사진은 main 함수의 일부분 이다. 위 어셈블리어 코드를 pseudo 코드로 나타내면 아래와 같다. 6번째 줄에서 Arbitrary overwrite 가 가능한 취약점이 존재하는 것을 볼 수 있다. 사용자가 입력한 3개의 인자를 잘 조작하면 Arbitrary overwrite가 가능하다. 아래 어셈블리어는 main 함수의 일부분 이다. rax에 &((rbp-0xa0) + 0xf ) 주소를 넣고 rdx에 rax 주소의 값을 넣는다. rdx 와 0xb000000b5 비교하여..
[pwnable.xyz] add write up
[pwnable.xyz] add write up
2019.12.28pwnable.xyz 세번째 문제 add 이다. 실행하면 인자 3개를 받고 어떤 값을 출력한다. 필자가 만든 명령어로 elf 파일 안에 사용자 정의 함수 list 를 보면 총 4개가 있는 것을 볼 수 있다. 그 중 main과 win 함수가 눈에 띄인다. ubuntu:~/environment/ctf/pwnable.xyz/03_add $ func challenge b handler b main b setup b win ubuntu:~/environment/ctf/pwnable.xyz/03_add $ (elf 파일에 사용자 정의 함수 출력하기) [Find user defined functions] elf에 사용자 정의 함수 찾기 CTF 문제를 풀때 ELF 파일을 GDB로 분석할 때가 있는데, 어떤 사용자 정의..
[pwnable.xyz] sub write up
[pwnable.xyz] sub write up
2019.12.28pwnable.xyz 두번째 문제 sub 이다. 바이너리 파일을 다운 받은 뒤 실행하면 아래와 같이 동작하는 것을 볼 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ ./challenge 1337 input: 1 1 ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ ./challenge 1337 input: 1337 1337 ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ 이 바이너리에 main 함수 및 사용자 정의 함수의 존재 여부를 확인하기 위해 필자가 만들어 놓은 명령어로 확인해 보면, main 함수 및 사용자 정의 함수가 존재하지 않는 것을 볼 수 있다. ubuntu:~/environme..
[Find user defined functions] elf에 사용자 정의 함수 찾기
[Find user defined functions] elf에 사용자 정의 함수 찾기
2019.12.27CTF 문제를 풀때 ELF 파일을 GDB로 분석할 때가 있는데, 어떤 사용자 정의 함수들이 있는지 알기 위해서 objdump 명령어를 사용하는 경우가 있다. objdump 명령어를 이용하면 간략하게 볼 수 없기 때문에 이를 간략하게 보기위해 c로 만들어 보았다. #include #include char *str_replace(char *orig, char *rep, char *with) { char *result; // the return string char *ins; // the next insert point char *tmp; // varies int len_rep; // length of rep (the string to remove) int len_with; // length of with (..
[pwnable.xyz] Welcome write up
[pwnable.xyz] Welcome write up
2019.12.26pwnable.xyz 사이트의 첫번째 문제 Welcome 문제이다, Excute 우선 실행해보면 아래 처럼 출력이 되는 것을 볼 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/01_welcome/image/challenge $ ./challenge Welcome. Leak: 0x7fb7e0f42010 Length of your message: 1 Enter your message: 1 Analyze peda-gdb로 이번 문제를 분석해보겠다. main 함수를 보려고 하니 찾을 수가 없다. 리눅스에서 main 함수의 주소를 찾기 위해서는 __libc_start_main 에 대해서 알아야 한다. main 함수 찾기 아래 사이트를 보면 설명이 잘 되어 있다. main startu..
[PHP] How To Prevent SQL injection attack via secure code
[PHP] How To Prevent SQL injection attack via secure code
2019.12.08php언어를 통해 SQL injection 공격을 막기 위해 안전한 코드를 짜야한다. 우선 mysqli 함수를 통해 DB에 접근하기 위한 코드는 아래와 같다. 위 코드를 db.php 파일이라고 정의하고, 이 파일을 include 하여 사용한다. mysqli의 PDO는 prepare라는 함수를 가지고 있다. 이것을 이용하여 안전하게 DB에 접근하여 값을 가져오거나 등등의 작업을 할 수 있다. INSERT 아래 예제는 user라는 테이블에 id와 pw를 Insert 하는 과정을 나타낸 것이다. 우선 $mysqli 변수를 쓰기 위해 db.php 파일을 include 하고 prepare 함수를 사용한다. 만약 prepare 함수에서 query에 에러 발생 시 $mysqli->error를 통해 에러를 출력한다. ..
[PHP] password_hash와 password_verify로 패스워드 안전하게 관리하기
[PHP] password_hash와 password_verify로 패스워드 안전하게 관리하기
2019.12.08DB에 패스워드를 안전하게 저장하기 위해서는 단방향 해시 함수를 사용하게 된다. 이유는 DB가 외부로 유출 되었을 때, 패스워드의 평문을 알아내기 어렵게 하기 위해서 이다. php에서 사용자의 패스워드를 해시 해주는 password_hash() 함수와, 사용자가 입력한 패스워드랑 해시된 패스워드를 비교해주는 password_verify() 함수가 있다. password_hash() password_hash()는 2개의 인자가 필요하다. 첫번재 인자는 해시할 패스워드, 두번째는 암호 알고리즘이다. Return 값은 해시 과정에서 에러 발생 시 false, 성공하면 문자열의 해시 값을 준다. password_hash ( string $password , int $algo [, array $options ] ..
1475번 - 방 번호 python
1475번 - 방 번호 python
2019.10.221475번: 방 번호 첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다. www.acmicpc.net #!/bin/python3 # prob 1475 # 6과 9는 특별한 경우 이므로 _ 로 치환 val = input("").replace('6','_').replace('9','_') # 0 ~ 9 숫자 세트 하나 구매 count = 1 sets = list() sets.append(['0','1','2','3','4','5','_','7','8','_']) # 여기도 역시 6과 9를 _로 치환 for num in val: check = 0 for c in range(0,count): # 구매한 숫자 세트 만큼 loop if num in sets[c]..
[BaekJoon] - 1193 분수찾기
[BaekJoon] - 1193 분수찾기
2019.10.141193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net 아래 표 처럼 번호 순서대로 규칙성을 가지고 있다. 1은 (1,1)로 시작하고, 2는 (1,2), 3은 (2,1), 4는 (3,1), 5는 (2,2)... 라고 필자는 좌표로 설정하고 코딩을 했다. 만약 사용자가 5라고 입력했을때, 출력되어야 하는 좌표는 (2,2) 이고 답은 2/2 이다. 1 > 5 1 + 2 > 5 1 + 2 + 3 > 5 1 + 2 + 3 일때 사용자가 입력한 값보다 처음으로 크므로, 이때 i=3이라고 하자. i가 홀수 일때는 (1,i)에서, 즉 6에서 x축으로 -1, y축으로 +1해서 5의 위치는 (1, i) + (1,-1) = (2,2) 라는 결과를 얻을 수 있다. 1..
[BaekJoon] - 10773 제로
[BaekJoon] - 10773 제로
2019.10.1310773번: 제로 문제 나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다. 재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다. 재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다. 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자! 입력 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ www.acmicpc.net if __name__ == "__main__": count = int(input("")) stack = list() while count > 0: val = int(input("")) if val == 0:..
[BaekJoon] - 10871 x보다 작은 수
[BaekJoon] - 10871 x보다 작은 수
2019.10.1310871번: X보다 작은 수 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다. www.acmicpc.net #!/bin/python3 # File name: poc.py if __name__ == "__main__": n, x = map(int, input("").split(" ")) number = input("").split(" ") result = list() for i in number: if x > int(i): result.append(i) print(" ".join(result))
[jquery] - this를 이용한 코드 중복 방지
[jquery] - this를 이용한 코드 중복 방지
2019.10.12jquery 사용시 같은 class나 id를 가진 태그가 예를들어 클릭이 되었을때 각 상황에 맞는 함수를 실행하려고 한다면 비효율적으로 작성 할 수도 있다. 하지만 this 를 사용하면 코드의 길이와 중복을 피할 수 있다. 아래 코드를 예로 들어 설명하겠다. Security web system hack server webhack 우선 서브 카테고리를 숨기고 메인 카테고리를 클릭했을 때, 그에 해당하는 서브 카테고리를 펼치거나 접어보려고 한다. 하지만 main class는 2개이기 때문에 각각의 상황에 맞는 코드를 중복하여 사용하기에는 똑같은 동작을 하는 코드가 중복이 되어 버린다. 이때 this를 사용하면 간단해진다. Security web system hack server webhack this 를 사..
[jquery] - 카테고리 펼치기 접기 만들기
[jquery] - 카테고리 펼치기 접기 만들기
2019.10.12카테고리가 많을때 세로로 길게 나열된 것을 보면 보기 싫을때가 있다. jquery를 이용해 메인 카테고리를 기준으로 접고 펼칠 수 있다. 아래 코드를 기준으로 시작하겠다. test test1 test2 서브 카테고리가 일단 보이지 않아야 하기 때문에 sub class에 style을 아래와 같이 추가한다. test test1 test2 그리고 main 을 클릭했을때, 서브 카테고리가 보이게끔 아래와 같이 jquery를 작성해준다. main을 클릭할시 sub가 웹 페이지에 보일시( is(":visible") ), css() 함수로 display 속성을 none으로 바꾼다. sub가 웹 페이지에 보이지 않을 시, css() 함수로 display 속성을 block으로 바꾼다. test test1 test2 이를..
[BaekJoon] - 10936 base64 디코딩
[BaekJoon] - 10936 base64 디코딩
2019.10.1210936번: BASE64 디코딩 첫째 줄에 문자열 S를 BASE64로 인코딩한 결과가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다. www.acmicpc.net #!/bin/python3 # base64 디코딩 import string BIT = 8 if __name__ == "__main__": table = string.ascii_uppercase + string.ascii_lowercase + string.digits + "+/" b64_table = dict() count = 0 # Create base64 Table for char in table: b64_table[char] = str(count) count += 1 # Input ciph..
[BaekJoon] - 10935 base64 인코딩
[BaekJoon] - 10935 base64 인코딩
2019.10.1210935번: BASE64 인코딩 첫째 줄에 문자열 S가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다. www.acmicpc.net #!/bin/python3 # base64 인코딩 import string BIT = 6 def padding(binary): return binary + '0' * (BIT - len(binary) % 6) if __name__ == "__main__": b64_table = dict() count = 0 for char in string.ascii_uppercase + string.ascii_lowercase + string.digits + "+/": b64_table[str(count)] = char count += ..
[BaekJoon] - 10845 큐
[BaekJoon] - 10845 큐
2019.10.1210845번: 큐 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다. www.acmicpc.net #!/bin/python3 def pop(q): if len(q): return q.pop(0) else: return -1 def size(q): return len(q) def empty(q): if len(q): return 0 else: return 1 def front(q): if len(q): return q[0] else: return -1 def back(q): if len(q): return q[..
[BaekJoon] - 10828 스택
[BaekJoon] - 10828 스택
2019.10.1210828번: 스택 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다. www.acmicpc.net #!/bin/python3 def top(stack): if len(stack): return stack[::-1][0] else: return -1 def size(stack): return len(stack) def empty(stack): if len(stack) == 0: return 1 else: return 0 def pop(stack): if len(stack): return stack.pop() ..
[BaekJoon] 1158번 조세퍼스 문제
[BaekJoon] 1158번 조세퍼스 문제
2019.10.101158번: 조세퍼스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 2개의 언어(python, c)로 위 문제를 풀었다. python은 그냥 slicing으로 문제를 풀었다. #!/bin/python3 # poc.py def play(node, person, rule): result = list() while person > 0: result.append(node[(rule-1)%len(node)]) node = node[node.index(result[::-1][0])+1:] + node[:node.index(result[::-1][0])] person -= 1 print("") if __name__ == "__mai..
[thehackernews] - 안드로이드 폰에 영향을 줄 새로운 제로데이 취약점
[thehackernews] - 안드로이드 폰에 영향을 줄 새로운 제로데이 취약점
2019.10.07안드로이드 제로데이 취약점은 이스라엘 NSO 그룹(정부나 개인에게 제로데이 익스플로잇을 판매하는 것으로 유명한 그룹)이 타켓의 안드로이드 디바이스를 제어하기위해 악용된 것으로 발견되었다. Project Zero 연구로 의해 발견되었고, CVE-2019-2215라고 불리는 매우 심각한 보안 취약점에 대한 세부 내용과 개념 증명 악용은 안드로이드 보안 팀에게 그것을 보고한 7일 뒤 공개적으로 오늘 만들어 졌다. 제로데이는 안드로이드 커널의 binder driver에서 use-after-free 취약점으로 로컬 권한을 가진 공격자 또는 앱이 root 권한을 획득할 수 있고 잠재적으로 장치를 원격 제어가 가능하다. 취약한 안드로이드 장치 이 취약점은 2017 년 12 월에 릴리스 된 4.14 LTS Linux ..
[LOB] - zombie_assassin -> succubus 풀이
[LOB] - zombie_assassin -> succubus 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); check = 4; } void GUL(void) { if(check != 2) exit(0); printf("wel..
[LOB] - giant -> assassin 풀이
[LOB] - giant -> assassin 풀이
2019.10.06/* The Lord of the BOF : The Fellowship of the BOF - assassin - no stack, no RTL */ #include #include main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(argv[1][47] == '\x40') { printf("library retbayed you, too!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer)..