본문 바로가기

Toddler's Bottole14

pwnable.kr mistake [Toddller's Bottle] mistake 먼저 문제는 아래와 같다. 힌트가 연산자 우선순위임을 알 수 있다.아래와 같은 파일을 볼 수 있다. 아래 코드는 main()의 일부이다. 이 때,fd = open() < 0이라는 코드를 볼 수 있는데, 여기서 연산자 우선순위에 의해 fd에는 (open() < 0)의 결과가 들어간다.따라서 fd에는 0이 들어간다. 즉 pw_buf를 stdin으로 입력 받게 되므로pw_buf에 0000000000 을 넣고, pw_buf2에 xor한 값인 1111111111 을 넣어주면 아래와 같이 플래그를 얻을 수 있다. 2019. 2. 1.
pwnable.kr lotto [Toddller's Bottle] lotto ssh lotto@pwnable.kr -p2222 먼저 아래와 같은 파일들을 볼 수 있다. 소스코드에서 play() 함수를 보면 아래와 같이 score를 계산한 뒤 match가 6일 경우 플래그를 얻을 수 있음을 알 수 있다. 이 때, for 문을 보면 lotto와 submit이 일치하는지 확인하는 부분이 이상한 것을 알 수 있다.각 index별로 일치하는지를 확인하여야 하는데, 위의 코드를 보면 모든 index들을 다 확인하는 것을 볼 수 있다. 즉, lotto[0]은 submit[0]과만 비교하여 하는데, lotto[0]을 submit[0], submit[1], submit[2], submit[3], submit[4], submit[5] 모두와 비교한다... 2019. 2. 1.
pwnable.kr blackjack [Toddler's Bottle] blackjack 문제를 보면 'I like to give my flags to millionaires.' 이라는 문장을 볼 수 있다.Cash가 100만 이상이 되면 플래그가 나올 것으로 보인다. 먼저 nc pwnable.kr 9009 을 실행하면 아래와 같은 화면을 볼 수 있다. Y를 누르고, 1을 입력하면 플레이 할 수 있다. 플레이하면 아래와 같이 베팅할 금액을 쓰고 게임을 하게 된다. 이 때, 소스코드를 보면 int로 받는 것을 알 수 있다. 그 뒤, 게임에서 지면 cash = cash - bet;이기면 cash = cash + bet; 을 수행한다. 여기서 bet이 음수임을 확인하는 코드가 없기 때문에 -1000000을 입력한 뒤 게임에서 지면 클리어할 수 있다. 2019. 2. 1.
pwnable.kr coin [Toddler's Bottle] coin nc로 접속하면 coin 문제를 볼 수 있다. 문제 설명을 보면, N개의 수 중에서 무게가 9인 counterfeit coin을 찾는 것이다.나머지 코인의 무게는 10이며, C회 동안 입력한 인덱스들의 코인의 무게 합을 알려준다. 이 때, 몇 차례 실행해 보면, N이 2의 C승보다 항상 작거나 같은 것을 알 수 있다.즉 binary search를 이용하면 된다. 다만 처음부터 binary search를 생각하고 구현한 게 아니어서 익스가 다소 깔끔하지 못한 듯 하다....ㅠ 실행하면 아래와 같이 100회 실행 이후 플래그를 얻을 수 있다. 2019. 2. 1.
pwnable.kr input [Toddler's Bottle] input 먼저 input 코드는 아래와 같다. 5개의 스테이지로 이루어져있다. STAGE 1.stage1은 argv이다. argc가 100이고, argv['A'], argv['B']의 값이 특정 값이어야 클리어할 수 있다.따라서 pwntools를 이용하여 argv를 맞춰주면 된다. 이 때, argv[0]에는 실행파일의 경로가 들어간다.pwntools를 이용하여 argv를 넘겼을 때, argv[0]에 실행파일 경로가 추가되는지를 확인하기 위한 과정을 거쳤다. 아래와 같은 코드를 작성한 뒤 컴파일하였다. 그 뒤, first, second를 입력한 것이 첫 번째 실행 결과이다.argv[0]에는 경로가 들어가고 argv[1]에 first가 들어간 것을 볼 수 있다. argc도.. 2019. 2. 1.
pwnable.kr cmd2 [Toddler's Bottle] cmd2 cmd2 문제를 보면 아래와 같은 파일들을 볼 수 있다. 소스코드는 아래와 같다. 환경변수를 초기화하는 코드가 추가되었고, cmd1과 비교하면 필터링 대상도 더 늘어난 것을 볼 수 있다.특히 필터링 대상에 '/'가 추가되어, cmd1에서 이용한 '/bin/cat fla*'는 이용할 수 없을 것으로 보인다. 따라서 이번에는 command를 이용한다. '/bin'이 PATH에 포함되어 있기 때문에command의 -p 옵션을 이용하면 cat만 입력해도 실행되는 것을 볼 수 있다. 따라서 아래와 같이 입력하면 플래그를 얻을 수 있다. 2019. 2. 1.
pwnable.kr cmd1 [Toddler's Bottle] cmd1 cmd1 문제를 열면 아래와 같은 파일들을 볼 수 있다. 소스코드는 아래와 같다. argv[1]에 "/bin/sh"을 넘겨주면 system("/bin/sh")이 실행될 것이다.하지만 filter()에 의해 sh, tmp, flag가 필터링 되기 때문에 cat을 이용할 것이다.또한, flag라는 문자열도 필터링 대상이기 때문에 fla*와 같이 입력하였다. 그 결과 플래그를 얻을 수 있다. 2019. 2. 1.
pwnable.kr asm [Toddler's Bottle] asm ssh로 접속하면 아래와 같은 파일들을 볼 수 있다. 아래 사진은 소스코드의 일부이다. open(), read(), write()를 이용하여 플래그 파일을 읽는 쉘코드를 입력하면 된다. section .textglobal _start _start: push 0x0mov rax, 0x676e6f306f306fpush raxmov rax, 0x306f306f306f306fpush raxmov rax, 0x3030303030303030push raxmov rax, 0x303030306f6f6f6fpush raxmov rax, 0x6f6f6f6f6f6f6f6fpush raxmov rax, 0x6f6f6f6f6f6f6f6fpush raxmov rax, 0x6f6f6f303.. 2019. 2. 1.
pwnable.kr passcode Pwnable.kr# [Toddler’s Bottle] passcode passcode.c 파일을 열면 아래와 같이 main(), login(), welcome() 함수를 볼 수 있다. 이 때, login() 를 보면 scanf()를 할 때 passcode1과 passcode2의 주소가 아닌 값을 전달하는 것을 볼 수 있다. 따라서 Segmentation Fault가 발생할 것으로 예상된다. 이 때, welcome()을 호출한 뒤 login()을 호출하는 것을 알 수 있다.따라서 welcome에서 name을 A 100개로 채워보았다. 그 뒤, login()을 호출하였을 때, welcome()에서 스택에 저장한 값이 남아있는 것을 볼 수 있다. passcode1에 해당하는 ebx-0x10의 값을 보면 0x.. 2019. 2. 1.