목록Pwnable.kr/Toddler's Bottle (18)
Pwnstar

소스코드 #include #include #include #include #include #include #include #include #define PAGE_SIZE 4096 void* mmap_s(void* addr, size_t length, int prot, int flags, int fd, off_t offset); void* mem_arr[257]; void clear_newlines(void){ int c; do{ c = getchar(); }while (c != '\n' && c != EOF); } void create_note(){ int i; void* ptr; for(i=0; i256){ printf("index out of range\n"); return; } if(mem_arr[..

from pwn import* flag = "\x48\xBB\x6F\x30\x6F\x30\x6F\x6E\x67\x00\x53\x48\xBB\x6F\x30\x6F\x30\x6F\x30\x6F\x30\ x53\x48\xBB\x30\x30\x30\x30\x30\x30\x30\x30\x53\x48\xB p = remote("pwnable.kr", 9026) p.recvuntil("give me your x64 shellcode: ") p.sendline(flag) p.interactive() 이 문제를 마지막으로 우선은 토들러를 끝내고 루키스 문제들의 라업을 쓰려고 한다. 루키스 문제들은 어서 라업을 쓰지 않으면 금방 잊어먹을 것 같다. 쉘코드를 만들란다. 우선 들어가보자 들어가면 바이너리, 소스코드, read..

호크룩스..해리포터에 나오는 볼트모트의 영혼을 조각내 넣어놓은 물건들을 호크룩스라고 하던데.. ROP문제란다ㅎㅎㅎㅎ 접속해보니 소스코드가 없고 readme 파일이 있길래 한번 봤다. 음 별건 없고 nc로도 접속할 수 있다. 그러면 바이너리를 빼와서 IDA에 넣어봐야겠다. IDA 메인 함수에는 별다른 단서가 없다. init_ABCDEFG() 함수를 보자 랜덤값으로 a, b, c, d, e, f, g, v0 의 값이 정해지나보다. 이 값들을 모두 더한 값이 sum이라는 전역변수에 들어간다. 그 다음 ropme 함수를 들여다보자 이 함수가 사실상 메인일듯 하니. 이렇게 생겼다. 메뉴를 선택하라는 말이 나오는데, 아까 init_ABCDEFG 함수에서 나오는 값들을 메뉴에 입력으로 줘야 각 함수에 도달할 수 있는..

blukat이라는 문제이다. 이 문제는 실수...라기 보단 옆에서 문제푸는 걸 보고 있던 친구가 절대 복잡하게 생각하지 말라는 말을 듣고 정말 간단하게.. 단순하게 풀었다. 힌트가 만약 이 문제가 너무 어려우면 당신은 숙련된 플레이어란다....나는 숙련되지 못했다..ㅎㅎㅎ 일단 서버로 접속하면 이렇게 세 개의 파일이 있고, 소스코드가 이렇게 되어있다. password라는 파일에서 100만큼 읽어와서 password 변수에 저장하고, 그 내용과 입력받은 값을 비교하여 플래그를 출력하는 간단한 방식이다. 당시에 풀 때에는 password 내용을 사실 볼 수 있는게 아닐까??라는 생각이 들어 한 번 확인해본게 맞아 떨어져서 쉽게 풀었다. 즉, 보통 볼 수 없는 파일을 확인하려고 할 때 저런 식으로 문구가 뜬다..

저번 문제와 이어서 힙 문제이다. 우선, 32비트 바이너리이고, NX와 partial relro만 걸려있다. 소스코드 #include #include #include typedef struct tagOBJ{ struct tagOBJ* fd; struct tagOBJ* bk; char buf[8]; }OBJ; void shell(){ system("/bin/sh"); } void unlink(OBJ* P){ OBJ* BK; OBJ* FD; BK=P->bk; FD=P->fd; FD->bk=BK; BK->fd=FD; } int main(int argc, char* argv[]){ malloc(1024); OBJ* A = (OBJ*)malloc(sizeof(OBJ)); OBJ* B = (OBJ*)malloc(s..

이번에는 앞의 두 문제를 건너뛰고 uaf와 unlink 순서대로 라이트업을 쓰려고 한다. 이유는 이 두 문제 모두 스스로의 힘으로 풀지 못하고 룸메 도움을 많이 받았는데, heap 문제를 처음 접해봐서 그런지 이해가 잘 가지 않았기 때문이다. 더 확실히 이해하기 위해 천천히 다시 풀어보면서 라업을 써보려고 한다. 우선은 64비트 바이너리이고, 보호기법은 NX밖에 걸려있지 않다. 소스코드 #include #include #include #include #include using namespace std; class Human{ private: virtual void give_shell(){ system("/bin/sh"); } protected: int age; string name; public: vir..

13번째 로또 접속 이것도 전 문제같은 게임 형식의 문제일 것 같아 바로 실행해봤다. 이렇게 1번 로또 실행, 2번 도움말, 3번 종료가 있다 1번을 누르면, 6개의 수를 입력하라는 문구가 있다. 뭐...이것도 랜덤 값 맞추는 그런 문제일 것 같다. 이렇게 숫자가 틀리면 bad luck...이라는 문구가 뜬다. 이제 소스코드를 확인해보자. #include #include #include #include unsigned char submit[6]; void play(){ int i; printf("Submit your 6 lotto bytes : "); fflush(stdout); int r; r = read(0, submit, 6); printf("Lotto Start!\n"); //sleep(1); /..

12번째 문제 blackjack이다. 이것도 한번 실행해보자. 이렇게 시작하면 1번으로 게임을 시작할 수 있고, 2번으로 규칙 확인, 3번으로 게임을 종료할 수 있다. 그 전에 http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 이 사이트로 가면 이 게임의 소스코드가 나와있는데, 봐도 뭐 어느 부분에서 플래그가 뜨는지, 쉘이 따지는 지가 나와있지 않다. 우선은 뭐 돈을 많이 따면 되겠지 하면서 게임을 하기 시작했는데 너무 아무 생각없이 오래 하다가 정신을 차렸다. 그래서 일단 더 게임을 하며 생각을 해 보다가...돈을 -10000000 이런 식으로 배팅하면 어떻게 될까 싶어서 해봤다. 이런 식으로 -100000..