이번 포스트에서는 Pwnable의 mistake 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\n"); system("/bin/ca..
이번 포스트에서는 Pwnable의 leg 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (key1()+k..
이번 포스트에서는 Pwnable의 input문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) return 0; if(strcmp(..
이번 포스트에서는 Pwnable의 random 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } ## 문제 해석 : 해당 문제의 코드를 살펴보니 key값과 random값의 XOR 연산 값이 0xdeadbeef가 되어야 해결할 ..
이번 포스트에서는 Pwnable의 passcode 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ printf("Login OK!\n")..
이번 포스트에서는 Pwnable의 flag 문제에 대해 다루겠다. 문제 파일을 실행하면 다음과 같다. ## 문제 해석 : IDA를 활용하여 문제를 분석해보면 다음과 같이 UPX로 패킹되어 있다는 사실을 알 수 있다. ## 문제 풀이 : upx -d 를 통해 해당 파일을 언패킹한 다음에 분석해보아야 한다. 언패킹한 파일을 다시 IDA를 통해 실행해보면 다음과 같이 flag값이 나오는 것을 확인할 수 있다. ## 최종 결과 : Flag = UPX...? sounds like a delivery service :)
이번 포스트에서는 알고리즘 중의 AOV/AOE 네트워크에 대해 다루겠다. AOV 네트워크란? : AOV는 Activity On Vertex의 약자이다. 즉, 정점이 Activity, 작업을 나타내고, 간선이 작업간의 우선순위 관계를 나타내는 방향 그래프이다. AOV 동작 과정 스택 [0], 위상 순서 [] 스택 [3, 2, 1], 위상 순서 [0] (1, 2, 3번 노드의 선행 노드 0이 사라졌으므로 스택에 저장) 스택 [2, 1], 위상 순서 [0, 3] 스택 [5, 1], 위상 순서 [0, 3, 2] 스택 [1], 위상 순서 [0, 3, 2, 5] 스택 [4], 위상 순서 [0, 3, 2, 5, 1] 스택 [], 위상 순서 [0, 3, 2, 5, 1, 4] AOE 네트워크란? : AOE는 Activi..
이번 포스트에서는 그래프 중의 최소비용 신장 트리 알고리즘에 대해 다루겠다. 최소비용 신장 트리 알고리즘의 제약 조건 : 그래프 내에 존재하는 edge들만 사용 n - 1개의 edge만 사용 Cycle을 형성할 수 있는 edge는 사용 불가 최소비용 신장 트리 알고리즘 (모두 greedy method 사용) : Kruskal Prim Sollin Kruskal 알고리즘이란? 한 번에 하나의 edge씩 추가하면서 최소비용 트리 T를 생성 Edge들을 비용의 오름차순으로 정렬한 후, 가장 비용이 적은 edge부터 선택(greedy) 선택된 edge는 기존에 선택된 edge들과 사이클을 형성하지 않을 경우에만 T에 포함 그래프 G가 연결되었으며, n > 0개의 vertex가 존재할 경우, 정확히 n - 1개의..
이번 포스트에서는 Lord of SQLInjection의 ouroboros문제에 대해 다루겠다. 문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다. ## 문제 해석 : 해당 문제는 preg_match() 함수를 통해 prob, _, ., rollup, join, @를 필터링하고 있다는 것을 알 수 있다. 또한 pw값을 알아야 문제를 해결할 수 있는 것으로 보인다. ## 문제 풀이 : 간단하게 pw=' or '1를 통해 공격을 시도해보겠다. ### 사용할 공격문 : pw=' or '1 ### 실행 결과 : 아무런 값이 출력되지 않다는 사실을 알 수 있다. 즉, 테이블 안에 아무 값이 존재하지 않다는 것이다. 그럼 이어서 union select 문을 활용하여 공격을 시도해보겠다. ..
이번 포스트에서는 Lord of SQLInjection의 phantom문제에 대해 다루겠다. 문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다. ## 문제 해석 : 해당 문제는 preg_match() 함수를 통해 duplicate를 필터링하고 있다는 것을 알 수 있다. 또한 no=1의 email값을 알아야 문제를 해결할 수 있는 것으로 보인다. ## 문제 풀이 : 일단 joinmail 파라미터에 아무 값을 넣어서 결과를 확인해보겠다. ### 사용할 공격문 : joinmail=haha ### 실행 결과 : 테이블에 no=0, ip, 'haha'가 새로 삽입된 것을 확인할 수 있다. insert문은 별도의 필터링이 없다면 여러 열을 삽입할 수 있는 취약점이 존재한다. 해당 취약점을..