본문 바로가기

전체 글157

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.
pwnable.kr random Pwnable.kr# [Toddler’s Bottle] random random 문제는 아래와 같다. key ^ random == 0xdeadbeef 이어야 한다.이는 key = random ^ 0xdeadbeef일 때 가능하다. 이 때 random은 c의 rand()를 이용하였다. 따라서 python에서 CDLL을 이용하여 libc.so의 rand() 값을 호출하여 0xdeadbeef와 xor한 값을 전달하면 된다. 그 결과 flag를 얻을 수 있다. 2019. 2. 1.
pwnable.kr collision Pwnable.kr# [Toddler’s Bottle] collision collision 문제를 보면 아래와 같은 화면을 볼 수 있다. col.c 파일은 아래와 같다. system(“/bin/cat flag”) 가 수행되도록 하면 된다.이 때 hashcode와 check_password( argv[1] )의 값이 같아야한다. check_password()를 보면 입력받은 20바이트를 char형 포인터로 받아 4바이트 씩 나누어 다섯 개를 더한 뒤 리턴한다. 즉 더했을 때 hashcode가 나오는 다섯 개의 수를 알면 된다.따라서 python을 이용하여 해당 수를 5로 나눈 뒤 적절히 맞추어 주었다. 그 결과 flag를 얻을 수 있었다. 2019. 2. 1.
pwnable.kr flag Pwnable.kr# [Toddler’s Bottle] flag flag 문제는 아래와 같다. 문제를 보면 파일이 패킹되어 있을 것 같다는 힌트를 얻을 수 있다.우선 실행해보면 아래와 같이 malloc()을 한 뒤 flag를 strcpy한다는 것을 알 수 있다. 그러나 파일이 패킹되어 있기 때문어 먼저 언패킹을 해주어야 한다.이 때strings ./flag를 이용하여 보면 ㅇ래와 같이 UPX executable packer로 패킹되었다는 것을 알 수 있다. kali에서 upx를 입력하면 아래와 같이 나온다. -d 옵션을 이용하여 먼저 언패킹을 한 뒤 gdb로 열었다. 주석으로0x6c2070 가 있다. 해당 주소의 값을 보면 flag의 주소가 들어 있다.따라서 그 값을 보면 flag를 얻을 수 있다. 2019. 2. 1.