본문 바로가기

WARGAME/Pwnable.kr

(15)
pwnablekr codemap 과제를 하면서 푼거를 추가해야지 흠우선 EAX와 EBX를 보란다. 보면 EAX에는 사이즈가 들어가고 EBX에는 이상한 문자열이 들어있다. 이렇게 생성하는데 다른 방법보다도 그냥 pydbg로 죄다 파싱했다. 저 1000개의 값중 2번째로 사이즈가 큰거에 스트링을 묻는다 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from operator import itemgetterfrom pydbg.defines import *from pydbg import *import pefile result = {} def entry_point(dbg): disasm = dbg.disasm(dbg.exception_addr..
pwnable.kr fix 12345678910111213141516171819202122232425262728293031323334353637383940414243#include // 23byte shellcode from http://shell-storm.org/shellcode/files/shellcode-827.phpchar sc[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; void shellcode(){ // a buffer we are about to exploit! char buf[20]; // prepare shellcode on executable stack! strcpy(bu..
pwnable.kr dragon dragon을 실행하면 영웅을 선택한다.영웅은 Preist와 Knight가 있는데 게임을 해본 사람이라면 누구나 알 수 있을 것이다.preist는 힐러 느낌이고 knight는 딜러 느낌이다한번 preist를 선택해보자 baby dragon을 만났다 baby dragon은 체력 50에 30데미지씩 입히고 5씩 회복한다. priest는 체력이 42에 마나가 50이다 근데 30씩 맞으면 그냥 죽으라는 소리 아닌가...스킬은 1. 마나 10 소모하고 20데미지를 준다.2. 마나를 회복한다.3. 한차례 무적 다음으론 knight를 보자이번에는 엄마 드래곤이다 체력이 80인 대신 회복력과 데미지가 조금 적다knight를 선택하면 스킬이1. 20데미지2. 40데미지 , 대신 내가 20 피해봄기사니 마나를 쓸일은 없지..
pwnable.kr coin1 NC로 접속을 해보면 위처럼 나온다. 위조된 동전을 찾으면된다.실제 동전의 무게는 10이고 위조된 동전은 9라는 값이 나오게된다.총 100개의 위조 동전을 찾으면 되는데 제한시간이 30초다. 코딩을해야한다.알고리즘을 하나 사용하는데 binary search를 이용하면 풀 수 있다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546# -*- coding: utf-8 -*-import timeimport socket def search(num, count): first = 0 last = num-1 for x in range(count+1): mid = (first+last)/2 data = " ".join(..
pwnable.kr simple login 소스를 아~~주 간략히 소개하자면 입력한 값을 base64로 디코딩하고그 값이 md5 해쉬값과 같다면 correct를 실행하는건데일단 12바이트를 넣어봤다. 이렇게 12바이트를 base64로 인코딩하고 그 값을 넣어준다. EBP를 보면 마지막에 넣은 4바이트로 EBP가 설정된 것을 볼 수 있다. 그럼 이걸 이용해서 우리의 목표인 correct 함수를 실행해보자. 끝부분을 corret함수로 설정해보았다. correct의 주소는 0x0804925f인데 ebp에 설정되니 -4값인 5b를 넣어주고 실행해 봤다. ASLR이 걸린 상태여서 저부분을 바로 correct로 설정할 수 없다. 고정값을 사용하고 있는 bss의 input을 사용하도록하자.즉 ebp를 문자열 입력 시작부분으로 덮는 것이다. 이렇게 값을 넣고 ..
pwnable.kr passcode ㅎㅇ 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==1337..
PWNABLE KR ascii_easy 안녕먼저 실행해보면그냥 저러고 끝이다 IDA로 보자 return할 때 vuln함수를 호출하는데 dest = 0xa8(168)여기서 BOF가 발생한다 다시 위에 사진을 보면 getchar위에 0x18F(399)만큼 입력을 받을 수 있다 힌트를 보면 ulimit가 있는데검색을 한참 해보니깐ulimit -s unlimited라는 명령어를 사용하면 주소를 고정시킬 수 있다 0x555c5250 시스템 주소 이번에 새롭게 배운것이 코딩을 해야 쉘주소를 알줄 알았는데 find &system, -99999999, "/bin/sh"-나+를 사용해서 쉘코드 주소를 알 수 있다 0x556e4a2c /bin/sh 주소다 argv처럼 인자를 쓰는게 아니니 파이프를 사용해서 입력하자이렇게 끝났다 성공
PWNABLE KR uaf UAF 문제를 풀어보자 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980#include #include #include #include #include using namespace std; class Human{private: virtual void give_shell(){ system("/bin/sh"); }protected: int age; string name;public: virtual void introduce(){ cout