https://www.hackerrank.com/challenges/staircase/problem Staircase | HackerRank Print a right-aligned staircase with n steps. www.hackerrank.com sample input과 output 과 같이 값을 입력하면 그에 맞게 계단이 나타나면 된다. 6을 입력하면 6개의 계단이 나타나는 것이다. 계단을 출력하는 함수 각 계단에서 맨 앞에서 빈칸이 출력되어야 하니 빈칸 부터 출력하도록 한다. j=0부터 n-1-i전까지 빈칸을 출력한다. n-1-i개 만큼 빈칸이 출력되는 것이다. 그리고 k가 0부터 i까지 #을 출력을 한다. 즉 i+1개 만큼 #이 출력이 된다. 이런식으로 코드를 짜면 계단을 만들 수 있다.
파일을 실행해보자 뭔가가 계속 변한다. IDA로 수도코드를 확인하자 main함수에서 echo함수를 호출하고 echo함수에서 gets를 통해 s를 입력받고 s의 주소값을 출력한다. 위의 실행결과와 코드를 합쳐서 보았을때 s의 주소값이 계속 변하는 것을 알 수 있다. s의 크기는 238바이트이다. echo를 disas해서 살펴보면 버퍼의 크기가 0xee인 것을 확인할 수 있다. 이것은 s의 크기이고 따라서 dummy 값이 없음을 알 수 있다. (다른 방법) bp1 : echo 함수의 첫번째 명령어 - 최상위 스택의 주소를 구할 수 있고 여기에 return address가 들어있음 bp2 : gets함수를 호출하는 call명령어 - s 주소를 구할 수 있음 bp1에서 구한 주소값은 0xffffd03c이고 bp..
ret2sc를 실행시켜 보자 이름을 입력받고 최선을 다하라고 한다. 보호기법이 무엇이 있는지 확인해보자 깔끔하다 이제 IDA로 뜯어보자 s의 크기는 ebp-14h로 알수 있다. 즉, s의 크기는 20바이트이다. name의 경우에는 read함수를 통해 50바이트까지 입력받을 수 있다. 그리고 gets함수를 통해 s에 길이 상관 없이 입력받을 수 있다. 여기서 취약점이 발생할 수 있다. name의 주소를 살펴보자 전역변수 name의 주소값은 0x0804A060이다. name변수에는 shellcode를 저장하고 gets함수로 payload를 전달해서 return address 영역에 &name을 저장하면 ret 명령어를 통해 쉘코드를 실행할 수 있다. main함수의 첫번째 명령어는 0x080484cd이고 이는..
Recursive Digit Sum - https://www.hackerrank.com/challenges/recursive-digit-sum/problem Recursive Digit Sum | HackerRank recursively sum all digits in a number until there is only one left www.hackerrank.com 파라미터로 전달받는 숫자를 각 자리마다 더해서 일의 자리가 될 때 return 하는 함수를 만들면 된다. n=148, k=3일때를 예시로 들어보자. n은 파라미터로 전달하는 숫자이고 이를 k번 곱하면 P가 된다. 즉, P는 148148148이 된다. super_digit(P) = super_digit(148148148) = super_di..
prob1 파일을 다운받고 실행을 시켜보자 허가 거부라 뜬다. ls -al로 확인을 해보니 실행권한이 없는 것을 알 수 있다. 따라서 파일에 접근 권한을 주기 위해 chmod를 사용하였다. chmod는 기존 파일 또는 디렉토리에 대한 접근 권한(파일 모드)을 변경할 때 사용되고 root에서 사용할 수 있다. chmod +x prob1을 통해 prob1 파일에 실행권한을 부여하자 다시 ls -al을 통해 확인하자 (위에 보다 시간이 더 빠른 이유는 처음에 ls -al로 확인하지 않고 실행권한을 부여해서 다시 다운받아서 해서 그렇습니다.) user(파일의 소유자)는 rwx접근권한을 가지게 되고, 이는 group도 마찬가지이다. others는 r과 x만 가능하다. 즉, 실행권한이 모두 다 부여된 것을 확인할 ..
Pwntools Gallospled 팀이 개발한 파이썬 익스플로잇 프레임워크로, 익스플로잇을 할 때 유용한 여러 기능들을 제공해 준다 설치 $ apt-get update $ apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential $ pip install --upgrade pip $ pip install --upgrade pwntools 사용법 1. Connection remote 원격 서비에 접속하여 통신할 때 사용되는 클래스 p = remote("127.0.0.1", 5000) 위 코드는 127.0.0.1 주소에 열려있는 5000번 포트에 TCP 연결을 맺는다. 연결이 성공적으로 맺어지면 remot..