본문 바로가기

IT(개발, 보안)/pwnable

(14)
[Pwnable 풀이] 14. lotto 14번째 풀이, lotto 문제이다. 먼저 ssh 접속을 위해 PuTTY 프로그램을 사용해서 디렉토리 내 파일을 점검했다. 현재 id는 lotto 이므로 flag값을 확인할 수 없고 lotto 실행 파일이 suid로 설정되어 있어 flag 값의 확인이 가능할 것으로 보인다. lotto.c의 코드를 살펴보자. 코드 길이가 길어서 나누어서 올리는 점 양해 부탁드립니다. 코드는 play(), help(), main() 함수 세개로 나누어져있다. main() 함수에서는 사용자에게 메뉴 선택권을 주고, help() 함수는 사용자에게 규칙에 대한 설명을 제공한다. play() 함수를 살펴보면 read 함수를 사용해서 표준입력(파일 디스크립터 0)에서 6바이트를 읽어서 submit 배열에 저장하는 점을 유의해야한다...
[Pwnable 풀이] 13. blackjack 이번 문제는 블랙잭 문제이다. http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html Simple Blackjack Program Replies: 3 Last Post: 03-30-2007, 02:42 PM cboard.cprogramming.com 문제의 링크로 접속하면 블랙잭 게임을 c언어로 구현해 놓은 소스 코드를 확인할 수 있다. 진짜 블랙잭 게임과는 다른 부분도 있지만 꽤나 보기 좋고 깔끔하게 구현해 놓았기 때문에 재미있었다. 문제에서 millionare 에게 flag를 준다고 했기 때문에 항상 이길수 있거나 비정상적인 방법으로 돈을 늘릴 수 있는 방법이 있는지를 유의하면서 코드를 살펴보다 취약점을 발견할..
[Pwnable 풀이] 12. mistake 이번 문제는 꽤나 간단하지만 힌트가 없었다면 다소 고전했을 것 같은 문제이다. 문제에서 operator priority가 주어졌는데 이를 유의하고 문제를 풀어보자. 먼저 접속 후에 디렉토리를 살펴보면 mistake 실행파일과 그 코드로 의심되는 소스코드 파일, flag와 password 파일이 있다. 현재 id는 mistake 이므로 flag와 password 파일은 열람하지 못하기 때문에 소스코드 파일을 먼저 살펴본다. xor함수와 main 함수로 구성되어 있는 소스코드 파일을 확인할 수 있다. xor 함수에서는 인자로 받은 문자열을 xor 시켜주는 역할을 수행하고 main 함수에서는 password 파일을 fd로 open()하고, 파일 속 내용을 pw_buf로 read()하여서 입력 받은 pw_buf..
[Pwnable 풀이] 11. leg 이번문제는 arm 어셈블리 언어에 대한 문제이다 해당 링크의 파일을 확인해보자 #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push{r6}\n" "addr6, pc, $1\n" "bxr6\n" ".code 16\n" "movr3, pc\n" "addr3, $0x4\n" "push{r3}\n" "pop{pc}\n" ".code32\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()+key2()+key3()) ==..
[Pwnable 풀이] 10. input 10번째로 푸는 문제이다. 먼저 접속해서 파일들을 살펴본다. input.c와 실행파일, flag가 존재한다. 상당히 긴 코드인데 부분 나눠서 살펴보자 먼저 프로그램 시작시 출력하는 인삿말 다음으로 프로그램의 입력 인자를 확인한다. argc는 입력받은 인자의 갯수로 총 100개의 인자를 가지고 있는지 확인하고, 그중 'A' 번째와 'B' 번째 인자의 값을 비교하는 구문이다. 그 다음으로 buf라는 문자열에 fd 0(표준입력, stdin)과 2(표준에러, stderr)의 값을 저장해 비교해보고 환경변수 중 하나의 값을 체크한다. 파일 하나를 오픈하여 읽어보고, 소켓을 열어 네트워크로 특정 값을 수신하는지 확인하는 구문을 거친 뒤 flag를 출력해준다. 전체적으로 프로그램이 입력으로 사용하는 5가지를 테스트하..
[Pwnable 풀이] 9. random 이번엔 1pt 짜리 간단한 문제이다. Putty를 사용해 해당 서버에 접속해보면 다음과 같은 파일들을 확인 할 수 있다. 여타 다른 문제들과 같게 random.c는 random의 소스코드로 보이고, 해당 소스를 분석해서 flag를 random 프로그램으로 얻어내는 문제 형식이다. 소스코드도 간단하다. rand() 함수를 사용해 random 변수에 난수값을 저장하고 이를 scanf로 받은 값과 XOR 하여서 deadbeef값과 같다면 flag를 출력해준다. 먼저 main 함수를 어셈블리로 풀어보았다. 랜덤 값은 13번 라인에서 생성되어 저장되는데 브레이크 포인트를 잡아서 해당 값을 확인해보자 해당 변수의 주소에 저장된 random 값은 0x6b8b4567이다. 난수 값이라면 응당 실행될때마다 다른 값으로 ..
[Pwnable 풀이] 8. passcode 최근 여행을 다녀오고 오랜만에 다시 문제풀이를 시작했다. 이번 문제는 Login system의 코드를 분석해보고 취약점을 찾아서 flag를 찾아보는 문제이다. 문제의 passcode.c 파일이다. main 함수에서는 인삿말을 출력하고 welcome() 함수와 login() 함수의 호출 외에는 별다른 기능이 없다 welcome 함수는 100 크기를 가진 name 배열에 사용자의 이름을 입력받아 출력하는 기능을 한다. login 함수에서는 정수형 passcode 2개를 입력받아 입력값을 검사하고 종료하는 기능을 한다. 해당 소스파일의 실행파일로 추정되는 passcode 실행파일을 실행해보았다. 실행파일을 실행해보면 passcode를 입력하는데에서 오류가 발생하며 종료되는데 다시 한번 위의 소스코드 파일을 살..
[Pwnable 풀이] 7. bof 분노의 bof 문제풀이... 인터넷 상에 다른 분들이 풀이 해놓은 거랑 차이점을 못찾겠는데 결과가 나오질 않아서 끙끙대다가 일단 풀이 공유하고 혹시 차이점을 알려주실수 있으시다면 댓글 부탁드리겠습니다.... 이번 문제는 Buffer Over Flow(BOF) 문제인데 두개 소스파일을 다운받고 nc를 사용해 서버에 접속해 flag를 확인하는 형식의 문제입니다. gdb를 사용해 실행파일을 분석하므로 Virtual box를 사용해 가상시스템상에서 풀이를 진행했습니다. 일단 wget을 사용해 두개 파일을 다운받아주고 먼저 bof.c 소스코드를 확인해 봤습니다. 전체적으로 간단한 구성으로 메인 함수는 0xdeadbeef 를 인자로 func 함수를 호출하고 func 함수에서는 overflow 변수에 gets로 값을..

반응형