https://www.hackerrank.com/challenges/camelcase/problem CamelCase | HackerRank www.hackerrank.com 문자열 s를 입력을 받고 s안의 단어의 개수를 리턴하는 함수를 만드는 문제이다. 예를 들어, saveChangesInTheEditor를 입력받으면 단어는 save, Changes, In, The, Editor이므로 5를 리턴하면 된다. 먼저 처음의 단어는 대문자가 아니기 때문에 count를 1로 초기화 시켜주고, 그 후 s[i]가 대문자면 count를 증가시키도록 코드를 짰다.
https://www.hackerrank.com/challenges/countingsort1/problem Counting Sort 1 | HackerRank Count the number of times each value appears. www.hackerrank.com Counting Sort는 다음과 같다. arr = [1, 1, 3, 2, 1] 이라고 하였을때 i가 0부터 4까지 증가하는 동안 result의 인덱스 값은 arr[i]가 되고 그 인덱스의 요소를 1 증가시키면 된다. arr[i]의 값은 0~99이므로 result의 최대 배열의 크기는 100이다. 문제푸는 공간에서 int *를 리턴해야 하므로 int *을 리턴하도록 만들어 주었다 countinSort의 매개변수는 각각 배열의 크기, ..
https://www.hackerrank.com/challenges/tree-preorder-traversal/problem Tree: Preorder Traversal | HackerRank Print the preorder traversal of a binary tree. www.hackerrank.com 트리를 preorder 방식으로 순회하면서 출력하는 방식 preorder 방식은 자신을 먼저 출력한 후 왼쪽 자식을 출력하고 오른쪽 자식을 출력하는 방식이다. 재귀를 이용하면 쉽게 풀 수 있다. 코드에서 preOrder함수만 작성을 하면 되었으므로 preOrder부분만 작성하였다. root가 NULL인지 아닌지 확인을 하기 위해서 if 문으로 작성을 하였고 if문 안에서는 먼저 자신을 출력을 하고 ..
먼저 파일을 실행해본다 system함수의 주소가 계속 바뀐다 보호기법 확인 NX bit가 걸려 있음 RTL을 통해서 우회할 수 있으므로 RTL로 문제 풀이 RTL을 이용하려면 system함수의 주소와 "/bin/sh"문자열의 주소가 필요 IDA로 파일을 까봤다. s의 크기는 68byte gets함수에서 버퍼오버플로우 발생 일단 디버깅 한 후 main함수 disas했다 main+40을 보면 0x44로 68바이트 이는 s의 크기와 같다 따라서 dummy가 없다 메모리 구조는 다음과 같다 ret[4] sfp[4] s[68] 72바이트를 dummy값으로 채워주고 ret에 system함수와 "/bin/sh" 문자열의 주소를 넣어주면 된다 main함수의 첫번째 명령어, gets함수 호출, ret에 breakpoin..
먼저 파일을 실행 이름을 물어보고 모르면 이상한 소리를 낸다 IDA로 코드를 까봄 s에 문자열을 입력을 받는다 s의 크기는 59byte what is your name? what is your quest? what is my secret? 다음에 s에 입력을 받다 print flag에 도달하기 위해서 what is your name? what is your quest? 다음 문자열을 입력받을 때는 "Sir Lancelot of Camelot\n"와 "To seek the Holy Grail.\n"를 입력 받아야 한다. What is my secret? 다음에는 gets함수로 문자열을 입력 받는다. v5의 값이 -559869752여야 print_flag를 할 수 있기 때문에 오버플로우를 이용하여 v5의 값..
https://www.hackerrank.com/challenges/qheap1/problem QHEAP1 | HackerRank Solve the basic heap question with insertion and deletion. www.hackerrank.com EASY라고 되어있지만 난이도는 EASY가 아니었던 문제였다. 이 문제는 3가지 query로 이루어져 있다. 1. add 2. delete 3. print minimum 1번은 그냥 heap에 원소를 더하는 것과 같이 하면된다. 3번은 minimum을 출력하는 것으로 Min Heap으로 heap을 구성하였다. 2번이 가장 큰 문제였다. 보통 heap에서 delete를 한다고 하면 가장 큰 원소/가장 작은 원소를 지운다. 그러나 이 문제에서..
https://www.hackerrank.com/challenges/quicksort1/problem Quicksort 1 - Partition | HackerRank Perform the first step of Quicksort: partitioning an array. www.hackerrank.com Quicksort Partition 문제 Partition 할 때 두가지 방법이 있다. 첫번째는 배열을 새로 만들어서 그 곳에 partition을 하고 원래의 배열에 다시 복사하는 방법이다. 두번째는 inline 방식이다. 두 방식 모두 배열의 가장 첫번째 원소가 pivot이 되고 pivot과 다른 원소들을 비교하면서 pivot을 기준으로 작은 원소들은 오른쪽, 큰 원소들은 왼쪽에 넣어준다. 첫번째 ..
https://www.acmicpc.net/problem/1065 1065번: 한수 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 �� www.acmicpc.net '한수'를 이해하지 못한다면 은근 까다로운 문제 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다 예를들어, 123 인경우 1, 2, 3은 공차가 1인 등차수열을 이루므로 한수이다. 951의 경우 9, 5, 1은 공차가 4인 등차수열로 한수이다. 777의 경우 7, 7, 7은 공차가 0인 등차수열로 한수이다. 십의자리 수는 무조건 등차수열일수 밖에 없다. 십의 자리 수..
먼저 파일을 실행해보았다 메뉴를 입력하면 해당하는 메뉴에 맞게 출력이 된다. NXbit 가 걸려있는데 RTL로 풀면 될 것 같다. 코드를 확인해보자 main함수 안에서 reduced_shell()을 호출한다 gets로 문자열을 입력 받는데 여기서 오버플로우가 일어난다 s의 크기는 0x1c=28byte이다. 더미값이 있는지 확인하기 위해서 디버깅 했다. 디버깅을 했더니 너무 길어서 reduced_shell 첫번째 명렁어에 bp해주고 gets함수 call 명령어에 bp 해준다음 거리를 구했다. 32바이트로 이는 28바이트 + 4바이트(sfp)인것을 알 수 있다. 따라서 더미값이 없음을 알 수 있다. 구조가 다음과 같을 것이다 ret[4] sfp[4] buf[28] 32바이트 만큼 dummy값을 채운다음 re..
먼저 파일을 실행해보았다 do you know return to library라고 되어있는걸 봐서 rtl 문제인거 같다 NX bit 가 걸려있다. RTL로 풀면 NX bit는 우회할 수 있으므로 RTL로 풀자 코드를 IDA를 이용해서 까보자 알고 싶은 주소값을 던져주면 See_something()을 통해서 해당 주소에 어떤 값이 저장되어 있는지를 출력을 해준다. 남길 말을 입력하라고 하는데 이때 Print_message에서 buffer overflow가 발생할 수 있다. Print_message함수의 인자로 256바이트가 전달 될 수 있는데 함수 내에서는 56바이트 버퍼에 카피를 하고 있다. 이때 오버플로우가 발생한다. Print_message함수를 디버깅을 해보자 +13을 보면 ebp-0x38로 크기가..